2012-04-16 89 views
0

爲什麼這被認爲是不正確的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或彙總爲 !

但我也不太清楚這是什麼意思?

+0

這被認爲是不正確的?你的意思是由SQL? – Nanne 2012-04-16 12:49:03

+1

hmm。不應該有一個''asfor'befor''總''? – Nanne 2012-04-16 12:49:53

回答

2

由於兩個EMPNO和DEPTNO被選中,你需要按這兩個領域:

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

或只選擇DEPTNO如果不使用EMPNO:

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

你選擇從結果Empno - 這不是幾個行的聚合函數,也不是分組的一部分,因此,對於它在查詢中沒有意義。對於同一部門的不同員工,您希望結果來自兩行?例如,請考慮以下數據:

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

結果應該是什麼?

+0

我已經更新了這個問題! – CJS 2012-04-16 12:53:36

+0

@CJS:你的更新基本上表明我預期錯誤信息是正確的。它沒有解釋你想要達到的目標。你會從我提供的數據中得到什麼結果? – 2012-04-16 12:54:38

+0

這是我無法理解的東西在我的SQL筆記 – CJS 2012-04-16 12:58:44

1

嘗試這個 -

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

錯誤消息非常明確:錯誤是因爲您的「裸體」員工編號在選擇列表,但不是按它分組(這很有意義,假設員工編號是唯一的:這會使你的group by無用)。

如果您正在尋找由部門支付給所有員工的工資總額,所有你需要做的是消除員工人數:

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

我想你要找的那是什麼:

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

你假定Empno對每個Deptno都是一樣的,所以它不需要按這個字段進行分組,但是在語法上這是不正確的。

1

當你要求分組結果時,要返回的字段應該是聚合函數的group by子句的一部分。

這是爲什麼?

從表EMP想象一下這樣的數據:

Empno Deptno 
1  1 
2  1 
3  2 
4  2 

Whehn你執行你的選擇,將有兩組(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 (該組的最大值)。