2012-04-16 31 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

+1

hmm。 「合計」のために「ある」べきではないでしょうか? – Nanne

答えて

2

を試してみてください、あなたは両方のフィールドでグループに必要

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

あなたは結果からEmpnoを選択している - それは、いくつかの行の集計機能はありません、またそれは、グループの一部であり、したがって、それはそれがクエリに含まれていることは意味がありません。同じ部門の異なる従業員のために、結果が2行になると予想しますか?たとえば、次のデータを考えてみましょう。

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

結果はどうなりますか?

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

またはEMPNOが使用されていない場合だけDEPTNOを選択します:EMPNOとDEPTNOの両方が選択されているので

+0

私は質問を更新しました! – CJS

+0

@CJS:あなたのアップデートでは、基本的にエラーメッセージが正しく表示されることが示されています。あなたが達成しようとしていることは説明していません。私が与えたデータからあなたが望む結果*が*得られるでしょうか? –

+0

これは私のSQLノートでは理解できなかったものでした – CJS

1

がthis-

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句の一部でなければなりません。

なぜですか?あなたの選択を行うWhehn二つのグループが存在することになる、

Empno Deptno 
1  1 
2  1 
3  2 
4  2 

(DEPTNO 1および2):

はあなたのEMP表から、このデータを想像してみてください。その場合、Empnoのためにどのデータを表示する必要がありますか?エンジンは理解できません。

だから、あなたの選択は異なる方法で固定することができます

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

EMPNOとDEPTNOの両方のためのグループ、または多分それ:DEPTNOによってグループ

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

、そしてちょうど1 EMPNOを与えます(グループの最大値)。

関連する問題