2012-12-21 31 views
17

Tôi thấy một ví dụ trong đó có một danh sách (bảng) của nhân viên với mức lương hàng tháng tương ứng của họ. Tôi đã làm một khoản tiền lương và thấy chính xác cùng một bảng trong ouptput !!! Điều đó thật kỳ lạ.Tại sao chúng ta cần GROUP BY với CHỨC NĂNG AGGREGATE?

Đây là những gì phải làm - chúng tôi phải tìm ra số tiền chúng tôi trả trong tháng này là lương nhân viên. Để làm được điều đó, chúng tôi cần tính tổng số tiền lương của họ trong cơ sở dữ liệu như được hiển thị -

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee 
GROUP BY EmpID 

Tôi biết rằng mình không sử dụng nhóm theo mã ở trên. Đây là những gì tôi không hiểu -

Chúng tôi đang chọn employeeid từ bảng nhân viên. SUM() đang được thông báo rằng nó phải thêm cột MonthlySalary, từ bảng Employee. Vì vậy, nó nên trực tiếp đi và thêm những con số lên thay vì nhóm chúng lại và sau đó thêm chúng.

Thats như thế nào một người sẽ làm điều đó - nhìn vào bảng nhân viên và thêm tất cả các số. Tại sao anh ta lại gặp rắc rối để nhóm chúng lại và sau đó thêm chúng lên?

+0

Nếu bạn muốn tổng hợp toàn bộ cột mà không có nhóm, thì không sử dụng nhóm SQL theo. SQL nhóm bằng cách không làm những gì một người sẽ làm. Trong SQL, việc nhóm sẽ không có ý nghĩa gì nếu bạn không làm gì đó với các nhóm. –

+0

@EricLeschinski - nhóm nào? –

+2

Các nhóm EmpID từ bảng Employee. Thay vì cố gắng so sánh nhóm nào bằng cách làm tương đối với những gì một người làm, hãy hỏi: Nhóm SQL hoạt động như thế nào và chúng ta có thể căn chỉnh nó theo những gì chúng ta muốn: http://stackoverflow.com/questions/7434657/how -các nhóm-by-công việc –

Trả lời

40

Có thể dễ dàng hơn nếu bạn nghĩ GROUP BY là "cho mỗi" vì mục đích giải thích. Các truy vấn dưới đây:

SELECT empid, SUM (MonthlySalary) 
FROM Employee 
GROUP BY EmpID 

đang nói:

"Hãy cho tôi tổng MonthlySalary của cho mỗi empid"

Vì vậy, nếu bảng của bạn trông như thế này:

+-----+------------+ 
|empid|MontlySalary| 
+-----+------------+ 
|1 |200   | 
+-----+------------+ 
|2 |300   | 
+-----+------------+ 

kết quả:

+-+---+ 
|1|200| 
+-+---+ 
|2|300| 
+-+---+ 

Tổng số sẽ không xuất hiện để làm bất cứ điều gì vì tổng của một số là số đó. Mặt khác nếu nó trông như thế này:

+-----+------------+ 
|empid|MontlySalary| 
+-----+------------+ 
|1 |200   | 
+-----+------------+ 
|1 |300   | 
+-----+------------+ 
|2 |300   | 
+-----+------------+ 

kết quả:

+-+---+ 
|1|500| 
+-+---+ 
|2|300| 
+-+---+ 

Sau đó, nó sẽ vì có hai empid 1 để tổng hợp lại với nhau.Không chắc chắn nếu lời giải thích này có giúp hay không, nhưng tôi hy vọng nó sẽ làm cho mọi thứ rõ ràng hơn một chút.

6

Nếu bạn muốn thêm lên tất cả các số bạn sẽ không có GROUP BY:


SELECT SUM(MonthlySalary) AS TotalSalary 
FROM Employee 
+-----------+ 
|TotalSalary| 
+-----------+ 
|777400  | 
+-----------+ 

Điểm của GROUP BY là bạn có được một tổng riêng biệt cho từng nhân viên.

+--------+------+ 
|Employee|Salary| 
+--------+------+ 
|John |123400| 
+--------+------+ 
|Frank |413000| 
+--------+------+ 
|Bill |241000| 
+--------+------+ 
1

Nếu bạn không chỉ định GROUP BY, chức năng tổng hợp hoạt động trên tất cả các bản ghi được chọn. Trong trường hợp đó, việc chọn một cột cụ thể như EmployeeID cũng không có ý nghĩa. Hoặc bạn muốn tổng số nhân viên, trong trường hợp này bạn chọn ID nhân viên và nhóm của nhân viên, hoặc bạn muốn tổng số trên toàn bộ bảng, vì vậy bạn bỏ qua ID nhân viên và mệnh đề GROUP BY.

Trong truy vấn của bạn, nếu bạn rời khỏi GROUP BY, ID nhân viên nào bạn muốn hiển thị?

2

Điều đáng buồn là có một cơ sở dữ liệu có hỗ trợ cú pháp bạn đang đề xuất:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee 

Tuy nhiên, MySQL không không làm những gì bạn mong đợi. Nó trả về tổng số tiền của MonthlySalary cho tất cả mọi người, và một EmployeeId tùy ý. Than ôi.

Câu hỏi của bạn là về cú pháp SQL. Câu trả lời là SQL đã được định nghĩa như thế nào và nó sẽ không thay đổi. Việc xác định các trường tổng hợp từ mệnh đề SELECT không phải là không hợp lý, nhưng đó không phải là cách ngôn ngữ này được xác định.

Tôi làm, tuy nhiên, có một số thông cảm cho câu hỏi. Nhiều người học SQL suy nghĩ về "nhóm" như một cái gì đó được thực hiện trong bối cảnh sắp xếp các hàng. Một cái gì đó như "sắp xếp các thành phố ở Mỹ và nhóm chúng theo tiểu bang ở đầu ra". Có ý nghĩa. Nhưng "nhóm theo" trong SQL thực sự có nghĩa là "tóm tắt bằng" không "giữ lại với nhau".

+0

'Nhiều người học SQL suy nghĩ về" nhóm "như một cái gì đó được thực hiện trong bối cảnh sắp xếp các hàng. Một cái gì đó như "sắp xếp các thành phố ở Mỹ và nhóm chúng theo trạng thái trong đầu ra" - Làm thế nào bạn có thể đạt được nhóm trong SQL sau đó? – Medorator

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