为什么这被认为是不正确的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或者是 聚合<!/强>
但我不太清楚这意味着什么......
答案 0 :(得分:2)
您从结果中选择Empno
- 这不是多行的聚合函数,也不是分组的一部分,因此它在查询中没有意义。对于同一部门的不同员工,您希望结果是两行?例如,请考虑以下数据:
Empno Deptno Sal
1 1 100
2 2 200
3 2 200
结果应该是什么?
答案 1 :(得分:2)
由于选择了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;
答案 2 :(得分:1)
试试这个 -
SELECT group_concat(Empno), Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
答案 3 :(得分:1)
错误信息非常清楚:错误是因为您在选择列表中有一个“裸”员工编号,但您没有按其分组(这是有道理的,假设员工编号是唯一的:它会让你的group by
无用。
如果您正在寻找按部门支付给所有员工的总薪水,您需要做的就是删除员工编号:
SELECT Deptno, SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno
答案 4 :(得分:1)
我认为您正在寻找的是:
SELECT Empno, Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Empno, Deptno;
你假设每个Deptno的Empno是相同的,所以不需要按此字段分组,但从语法上来说这是不正确的。
答案 5 :(得分:1)
当您要求分组结果时,要返回的字段应该是聚合函数的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(组中的最大值)。