web-dev-qa-db-ja.com

列の理由は、集約関数またはGROUP BY文節のどちらにも含まれていないため、選択リストで無効です。

可能な重複:
SQLにおけるGROUP BY /集計関数の混乱 /

私はエラーを得ました -

列 '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節部分の説明は何ですか?

230
david blaine

次のテーブル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行はa=1、2行目はa=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
476
Bill Karwin

ONLY_FULL_GROUP_BYサーバーモードを無効に設定すると( 、デフォルトでは )、クエリはMYSQLで機能します。しかし、この場合は、異なるRDBMSを使用しています。クエリを機能させるために、すべての非集計列を追加 _をGROUP BY句に追加します。

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

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

55
John Woo

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

SQLステートメントの出力に会社の全従業員をリストし、最初にアナハイムのオフィスのすべての人、次にバッファローのオフィスの人、次にクリーブランドのオフィスの人のリストを表示するのが望ましいと思います(A、 B、C、それを取得し、明らかに私はあなたが持っている場所がわからない)。

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

14
ExactaBox

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

8
Alex W