329

エラーが発生しました -

列 'Employee.EmpID' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。


select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 

この状況は、Bill Karwin の回答に当てはまります。

上記の修正、ExactaBox による回答に適合 -

select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 

元の質問 -

SQL クエリの場合 -

select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID)

このエラーが発生する理由がわかりません。私がやりたいのは、テーブルを結合して、特定の場所にいるすべての従業員をグループ化することだけです。

私は自分の質問について部分的な説明があると思います。大丈夫か教えて -

同じ場所で働くすべての従業員をグループ化するには、最初に LocationID を指定する必要があります。

次に、その横にある各従業員 ID について言及することはできません/言及しません。むしろ、その場所の従業員の総数に言及します。つまり、その場所で働く従業員を SUM() する必要があります。なぜ後者の方法で行うのか、よくわかりません。したがって、これはエラーの「どちらの集計関数にも含まれていません」という部分を説明しています。

GROUP BYエラーの句部分の説明は何ですか?

4

4 に答える 4

643

次のテーブルがあるとしますT

a   b
--------
1   abc
1   def
1   ghi
2   jkl
2   mno
2   pqr

そして、次のクエリを実行します。

SELECT a, b
FROM T
GROUP BY a

出力には 2 つの行が含まれている必要があります。1 つの行は wherea=1で、2 番目の行は wherea=2です。

しかし、bの値は、これら 2 つの行のそれぞれに何を表示する必要がありますか? それぞれの場合に 3 つの可能性があり、各グループの b にどの値を選択するかを明確にするクエリはありません。あいまいです。

これは、単一値ルールを示しています。これは、GROUP BY クエリを実行したときに得られる未定義の結果を禁止し、グループ化基準の一部でもなく、集計関数 (SUM、 MIN、MAX など)。

それを修正すると、次のようになります。

SELECT a, MAX(b) AS x
FROM T
GROUP BY a

これで、次の結果が必要であることは明らかです。

a   x
--------
1   ghi
2   pqr
于 2012-12-22T03:53:53.143 に答える
89

サーバーモードMYSQLを無効にするように設定した場合(デフォルトでは無効になっています) 、クエリはで機能します。ただし、この場合、別の RDBMS を使用しています。したがって、クエリを機能させるには、集計されていないすべての列を句に追加します。ONLY_FULL_GROUP_BYGROUP BY

SELECT col1, col2, SUM(col3) totalSUM
FROM tableName
GROUP BY col1, col2

非集計列は、列が、、、などの集計関数に渡されないことを意味しSUMます。MAXCOUNT

于 2012-12-22T03:59:42.700 に答える
19

「私がやりたいのは、テーブルを結合して、特定の場所にいるすべての従業員をグループ化することだけです。」

SQL ステートメントの出力で社内のすべての従業員を一覧表示する必要があるように思えますが、最初にアナハイム オフィスのすべての人、次にバッファロー オフィスの従業員、次にクリーブランド オフィスの従業員 (A、 B、C、わかります、明らかにあなたがどの場所にいるのかわかりません)。

その場合、GROUP BY ステートメントを失います。あなたに必要なのは ORDER BY loc.LocationID

于 2012-12-22T03:55:58.093 に答える
15

基本的に、このエラーが言っているのは、GROUP BY句を使用する場合、結果は各グループの行を持つリレーション/テーブルになるため、SELECTステートメントではその列のみを「選択」できるということです他の列は結果のテーブルに表示されないため、その列でグループ化し、集計関数を使用します。

于 2012-12-22T03:54:50.507 に答える