26

我看到了一个例子,其中有一个员工列表(表格)以及他们各自的月薪。我计算了工资的总和,并在输出中看到了完全相同的表格。那很奇怪。

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

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

我知道如果我不在GROUP BY上面的代码中使用,我会得到一个错误。这是我不明白的。

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

这就是一个人的做法——查看员工表并添加所有数字。为什么他们会不厌其烦地把它们分组然后加起来呢?

4

4 回答 4

54

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

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

是说:

“给我每个empid 的月薪总和”

因此,如果您的表格如下所示:

+-----+------------+
|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 相加。不确定这个解释是否有帮助,但我希望它能让事情变得更清楚一些。

于 2012-12-21T23:41:43.520 回答
9

如果您想将所有数字相加,则不会有 GROUP BY:


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

GROUP BY 的要点是您可以为每个员工获得单独的总数。

+--------+------+
|Employee|Salary|
+--------+------+
|John    |123400|
+--------+------+
|Frank   |413000|
+--------+------+
|Bill    |241000|
+--------+------+
于 2012-12-21T23:37:00.463 回答
8

可悲的是,有一个数据库支持您建议的语法:

SELECT EmployeeID, SUM (MonthlySalary) 
FROM Employee

然而,MySQL 并没有达到您的预期。它返回每个人的 MonthlySalary 的总和,以及一个任意的 EmployeeId。唉。

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

不过,我确实对这个问题表示同情。许多学习 SQL 的人认为“分组”是在对行进行排序的上下文中完成的。诸如“对美国的城市进行排序并在输出中按州对它们进行分组”。说得通。但是 SQL 中的“分组依据”实际上意味着“汇总”而不是“保持在一起”。

于 2012-12-22T00:19:44.593 回答
2

如果您不指定GROUP BY,聚合函数将对所有选定的记录进行操作。在这种情况下,同时选择特定列(如EmployeeID. 您想要每个员工的总计,在这种情况下,您选择员工 ID 和按员工分组,或者您想要整个表的总计,因此您省略了员工 ID 和GROUP BY子句。

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

于 2012-12-21T23:40:16.763 回答