0

为什么这被认为是不正确的 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 中,要么被聚合!

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

4

6 回答 6

2

您正在Empno从结果中进行选择 - 这不是多行的聚合函数,也不是分组的一部分,因此它在查询中没有意义。您希望同一部门中不同员工的两行结果是什么?例如,考虑以下数据:

Empno    Deptno    Sal
    1         1    100
    2         2    200
    3         2    200

结果应该是什么?

于 2012-04-16T12:49:07.563 回答
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;
于 2012-04-16T12:50:39.620 回答
1

试试这个-

SELECT group_concat(Empno), Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno;
于 2012-04-16T12:50:36.000 回答
1

错误消息非常清楚:错误是因为您在选择列表中有一个“裸”员工编号,但您没有按它分组(这是有道理的,假设员工编号是唯一的:它会使您group by无用)。

如果您正在查找按部门支付给所有员工的总工资,您需要做的就是删除员工编号:

SELECT Deptno, SUM(Sal) "Total"
FROM Emp
GROUP BY Deptno
于 2012-04-16T12:53:57.063 回答
1

我认为您正在寻找的是:

SELECT Empno, Deptno,
SUM(Sal) "Total"
FROM Emp
GROUP BY Empno, Deptno;

您假设 Empno 对于每个 Deptno 都是相同的,因此不需要按此字段分组,但从语法上讲这是不正确的。

于 2012-04-16T12:57:14.187 回答
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(该组的最大值)。

于 2012-04-16T13:00:41.083 回答