为什么我们需要GROUP BY和AGGREGATE FUNCTIONS?

时间:2012-12-21 23:34:10

标签: sql

我看到一个例子,其中有一份员工名单(表格)及其各自的月薪。我做了一笔工资,并在ouptput中看到完全相同的表!那很奇怪。

以下是必须做的事情 - 我们必须找出这个月我们支付多少钱作为员工工资。为此,我们需要在数据库中汇总其工资金额,如图所示 -

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

我知道如果我在上面的代码中不使用group by,我会收到错误。这是我不明白的 -

我们从员工表中选择employeeid。 SUM()被告知它必须从Employee表中添加MonthlySalary列。因此,它应该直接添加这些数字而不是将它们分组然后添加它们。

这是一个人如何做到这一点 - 查看员工表并添加所有数字。为什么他会麻烦地把它们分组然后加起来?

4 个答案:

答案 0 :(得分:47)

为了解释起见,将GROUP BY视为“为每个人”可能会更容易。查询如下:

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

说:

“每个 empid为我提供MonthlySalary的总和”

所以如果你的表看起来像这样:

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

结果:

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

Sum似乎不会做任何事情,因为一个数字的总和就是那个数字。另一方面,如果它看起来像这样:

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

结果:

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

然后它会因为有两个empid 1来总结。不确定这个解释是否有帮助,但我希望它能让事情变得更加清晰。

答案 1 :(得分:7)

如果你想加上你没有GROUP BY的所有数字:


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

GROUP BY的要点是每个员工都有一个单独的总额。

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

答案 2 :(得分:4)

令人遗憾的是,有一个数据库支持您建议的语法:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee

但是,MySQL 做你期望的事情。它返回每个人的MonthlySalary的总和,以及一个任意的EmployeeId。唉。

您的问题是关于SQL语法。答案是SQL是如何定义的,它不会改变。确定SELECT子句中的聚合字段并非不合理,但不是这种语言的定义方式。

但是,我确实对这个问题表示同情。许多学习SQL的人都认为“分组”是在排序行的上下文中完成的事情。类似于“对美国的城市进行排序,并按产出状态对其进行分组”。说得通。但SQL中的“分组依据”实际上意味着“总结”并非“保持在一起”。

答案 3 :(得分:2)

如果未指定GROUP BY,则聚合函数将对所有选定的记录进行操作。在这种情况下,选择像EmployeeID这样的特定列也没有意义。您希望每个员工总数,在这种情况下,您按员工选择员工ID和组,或者您希望整个表中的总计,所以您省略了员工ID和GROUP BY子句。

在您的查询中,如果省略GROUP BY,您希望显示哪个员工ID?