2011-09-12 48 views
117

Một người nào đó đã gửi cho tôi truy vấn SQL trong đó khoản GROUP BY bao gồm tuyên bố: GROUP BY 1.Điều khoản SQL "GROUP BY 1" có nghĩa là gì?

Đây phải là lỗi chính tả? Không có cột nào được đưa ra bí danh 1. Điều này có ý nghĩa gì? Tôi có quyền cho rằng đây phải là lỗi đánh máy không?

+2

Đó không phải là lỗi đánh máy, cột đầu tiên của tập hợp kết quả của bạn – Lamak

+5

Lưu ý rằng cú pháp này không thể di chuyển được. Nó sẽ hoạt động khác nhau trên cơ sở dữ liệu khác với mysql. Trong Oracle, ví dụ, nó được coi là một hằng số. –

+2

@RussellReed Có. Thật không may (kể từ khi sử dụng một bí danh đôi khi rất hữu ích) ansi sql không cho phép nhóm theo thứ tự cột. Lý do là nhóm xảy ra trước khi chiếu. Nhưng sau đó .. những gì khi chúng tôi có nhóm biểu thức với hàng chục dòng .. chúng tôi kết thúc với .. * mutiple * của hàng chục dòng trong báo cáo sql cuối cùng. – javadba

Trả lời

128

Điều này có nghĩa là nhóm theo cột đầu tiên bất kể cột được gọi là gì. Bạn có thể làm tương tự với ORDER BY.

8

Nó sẽ nhóm bởi trường đầu tiên trong mệnh đề select

32
SELECT account_id, open_emp_id 
     ^^^^  ^^^^ 
      1   2 

FROM account 
GROUP BY 1; 

Trong trên truy vấn GROUP BY 1 đề cập đến first column in select statement đó là account_id.

Bạn cũng có thể chỉ định trong ORDER BY.

Note : The number in ORDER BY and GROUP BY always start with 1 not with 0. 
17

Ngoài việc nhóm theo tên trường, bạn cũng có thể nhóm theo thứ tự hoặc vị trí của trường.

Điều này thường không được đề cập nếu bạn nhóm vào một điều gì đó cụ thể, vì cấu trúc bảng/khung nhìn có thể thay đổi; Ngoài ra, khó đọc hơn (tín dụng: Yuck). Tuy nhiên nếu bạn đang quay trở lại một bộ duy nhất của một cái gì đó, sau đó nó là okay.

+5

+1 cho "không làm điều này" và tôi muốn thêm rằng lý do tốt nhất để tránh nó là nó không thể đọc được. – Yuck

1

Nó sẽ nhóm theo vị trí cột bạn đặt sau nhóm theo mệnh đề.

ví dụ: nếu bạn chạy 'SELECT SALESMAN_NAME, SUM(SALES) FROM SALES GROUP BY 1' , nó sẽ nhóm theo SALESMAN_NAME.

Một rủi ro khi làm điều đó là nếu bạn chạy 'Select *' và vì một lý do nào đó bạn tạo lại bảng với các cột theo thứ tự khác, nó sẽ cho bạn một kết quả khác với bạn mong đợi.

0

Điều đó có nghĩa là nhóm sql theo cột thứ nhất trong mệnh đề lựa chọn của bạn, chúng tôi luôn sử dụng GROUP BY 1 cùng với ORDER BY 1, ngoài ra bạn cũng có thể sử dụng như thế này GROUP BY 1,2,3.., tất nhiên là thuận tiện cho chúng tôi nhưng bạn cần chú ý đến điều kiện đó kết quả có thể không phải là thứ bạn muốn nếu một số đã sửa đổi các cột đã chọn của bạn và không được hiển thị trực quan

Các vấn đề liên quan