GROUP BY使用不正确

时间:2012-04-16 12:46:11

标签: mysql

为什么这被认为是不正确的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或者是 聚合<!/强>

但我不太清楚这意味着什么......

6 个答案:

答案 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(组中的最大值)。