2016-05-14 19 views
-1
select Customers.cust_id, count(Orders.cust_id) 
from Customers left outer join Orders 
on Customers.cust_id=Orders.cust_id 
group by Customers.cust_id 

これはすべてを正しく表示します。集約を持つ非常に基本的なSQLスクリプト

select Customers.cust_id, ***Customers.cust_name***, count(Orders.cust_id) 
from Customers left outer join Orders 
on Customers.cust_id=Orders.cust_id 
group by Customers.cust_id 

,,あなたのクエリは、集計関数のポートとして指定された式「CUST_NAME」を含んでいません。」

なぜそれがありますか?お客様の各CUST_IDがCUST_NAMEに名前を持っています。何故でしょうこのエラーメッセージ?(集計関数で使用されていない)

+3

* Customersの各cust_idには、cust_name。*の名前があります。アクセスはそのことを認識していません。それはあなたの言葉を取るべきでしょうか?すべての集約されていない列は集約SQLクエリのグループ化として指定する必要があるため、 'group by'句に' cust_name'を追加するだけです。 – Parfait

+3

エラーメッセージは**問題が何であるかを正確かつ明確に伝えています** **クエリに集計関数**の一部として* cust_name *は含まれていません**。つまり、 'GROUP BY'節にリストされる必要があります。実際に**エラーメッセージで**の言葉を読むことを学ぶべきです。彼らはほとんど常に実際の意味を伝えています。ルールは次のとおりです:IOW、 'COUNT()'、 'AVG()'、または 'MAX()'のように()によって関数に含まれていない場合、 GROUP BYで指定します。 –

+0

... MySqlを使用している場合を除き、ここではansi規格に違反しています。ありがとうhttp://stackoverflow.com/search?q=%5Bms-access%5D+not+include+aggregate –

答えて

2

あなたは、集計関数を使用しcount()他のすべてのフィールドはGroup By句に現れなければなりません。


ここに私の説明があります:

集約関数はグループ全体で動作します。

(何のグループまたは他のフィールドが、彼らは、デフォルトでは、全体のレコードセット間で動作する場合には、指定されていない場合を除きすなわち、例えば、SELECT Sum(Salary) FROM Staff作品。)

cust_idすることにより、あなたのグループは、それが何を知っている場合出力、それぞれの数はcust_idです。しかし、それはcust_nameさんの場合はどうなりますか?どちらのcust_nameを出力すればよいでしょうか、それとも出力するべきですか?cust_id出力ごとに表示されますか? cust_idの場合にcust_nameが複数ある場合はどうなりますか?各cust_idには1つの行しか表示されないので、それに沿ってどのような名前を表示する必要がありますか?正確には、cust_idに対応するcust_nameが1つあることを前提としません。

cust_idごとにcust_nameがある場合、両方でグループ化すると、同じ数の行が(cust_idと同じように)生成され、一貫した信頼性の高い動作が得られます。

+0

: – Chris

+0

私は説明を追加しました。 –

0
select Customers.cust_id, Customers.cust_name, count(Orders.cust_id) 
from Customers left outer join Orders 
on Customers.cust_id=Orders.cust_id 
group by Customers.cust_id, Customers.cust_name 
関連する問題