为什么这被认为是不正确的 GROUP BY 用法?
SELECT Empno, Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
我的笔记中给出的结果是:
Empno Deptno Total ------- ------ -------- ? 10 8750 ? 20 10875 ? 30 9400
原因是:
SELECT 列表中的所有列必须要么出现在 GROUP BY 中,要么被聚合!
但我不太清楚这意味着什么......
为什么这被认为是不正确的 GROUP BY 用法?
SELECT Empno, Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
我的笔记中给出的结果是:
Empno Deptno Total ------- ------ -------- ? 10 8750 ? 20 10875 ? 30 9400
原因是:
SELECT 列表中的所有列必须要么出现在 GROUP BY 中,要么被聚合!
但我不太清楚这意味着什么......
您正在Empno从结果中进行选择 - 这不是多行的聚合函数,也不是分组的一部分,因此它在查询中没有意义。您希望同一部门中不同员工的两行结果是什么?例如,考虑以下数据:
Empno Deptno Sal
1 1 100
2 2 200
3 2 200
结果应该是什么?
由于同时选择了 Empno 和 Deptno,因此您需要按两个字段进行分组:
SELECT Empno, Deptno, SUM(Sal) "Total"
FROM Emp
GROUP BY Empno, Deptno;
或者如果没有使用 Empno,则只选择 Deptno:
SELECT Deptno, SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
试试这个-
SELECT group_concat(Empno), Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
错误消息非常清楚:错误是因为您在选择列表中有一个“裸”员工编号,但您没有按它分组(这是有道理的,假设员工编号是唯一的:它会使您group by无用)。
如果您正在查找按部门支付给所有员工的总工资,您需要做的就是删除员工编号:
SELECT Deptno, SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno
我认为您正在寻找的是:
SELECT Empno, Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Empno, Deptno;
您假设 Empno 对于每个 Deptno 都是相同的,因此不需要按此字段分组,但从语法上讲这是不正确的。
当您要求分组结果时,要返回的字段应该是 group by 子句的一部分,或者是聚合函数的一部分。
这是为什么?
想象一下您的表 Emp 中的这些数据:
Empno Deptno
1 1
2 1
3 2
4 2
当您执行您的选择时,将有两个组(Deptno 1 和 2)。在这些情况下,应该为 Empno 显示哪些数据?引擎无法判断。
因此,您的选择可以通过不同的方式修复:
SELECT Empno, Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Empno, Deptno;
Empno 和 Deptno 的分组,或者可能:
SELECT Max(Empno), Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
按 Deptno 分组,并且只给出一个 Empno(该组的最大值)。