1. ホーム
  2. sql

[解決済み】列が集約関数またはGROUP BY句のいずれにも含まれていないため、選択リストでは無効である理由【重複

2022-03-26 08:31:23

質問

エラーが発生しました。

列 '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()する必要があります。なぜ後者の方法をとるのか、私にはよくわかりません。 これは、エラーの一部である "it is not contained in either an aggregate function" を説明するものです。

については、どのように説明していますか? GROUP BY の部分がエラーになるのでしょうか?

解決方法は?

次のような表があるとします。 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