2016-04-24 3 views
-1

誰かが、全顧客の名前と合計顧客数を取得しようとすると、次のクエリでエラーが発生する理由を説明できますか?集計関数を含むselect文を使用するとエラーが発生します。

SELECT name, COUNT(*) 
FROM CUSTOMER 

私は、集計関数と一緒に列を選択すると、すべての列名を含む文のGROUP BYが必要ですが、私はこの背後にある論理的な原理を理解していないことを知っています。

編集:私は「エラー」推測

http://sqlfiddle.com/#!2/90233/595 はかなり右ではありませんが、現在のクエリが唯一の結果としてアリソン9返す方法に気づきます。それが戻らない理由を私は理解していない :

アリソン9

アリソン9

アリソン9

アリソン9

ジェイソン9

...

+0

エラーは何ですか? – nicomp

+1

おそらく、あなたはSQL Serverを使用しています。デフォルト設定では、MySQLはエラーを生成しません。 –

+0

実際には、最初の顧客名の横に合計数が返ってくると思います。私たちが望むのは、お客様名の完全な一覧であり、それぞれの顧客名の総数がそれに並んでいます。だから私は集計を使用して完全な顧客名リストが崩壊した理由を理解していない – nsledeski

答えて

0

(これはコメントに基づいて、新たな答えであるとフィドルを見て)

ここでの問題は、MySQLが集約関数を処理する方法である - そして、誰も非標準的な方法と異なっています。

mysqlでは、集計関数を使用できます(count()は集計関数の例です)。 count(*)を使用すると、すべての(またはほとんどの?)他のSQL実装では、グループが必要になります。あなたがグループを持っているときは、そのグループの範囲を(例えば、名前でグループ化して)言わなければなりません。 すべての列は、集計関数の範囲または結果になければなりません。

あなたは範囲を持っていないので、mysqlはテーブル全体を想定しています。また、集計関数の結果でも、範囲(この場合は名前)でもないカラムがあるため、mysqlはそのカラムを集合関数の結果mysqlで指定されているかどうかわからない - 「max()」と言うことができる。 (かなりmax()です)。実際に実行されているSQLは

SELECT ANY_VALUE(name), COUNT(*) 
FROM CUSTOMER 

です。したがって、1つの名前しか表示されません。

MySQLのドキュメント - http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html

私はMySQLが範囲内にない列のデフォルトの集計関数ANY_VALUE()を使用することがわかり上記を読んだ後。


あなただけの各行の顧客数の合計をしたい場合は、あなたが構文、GROUP BYを必要としない。このように、この

SELECT DISTINCT NAME, COUNT(NAME) OVER() AS CustomerCount 
FROM CUSTOMER 

を行うことができます。カバーの下では、おそらく@GordonLinoffの答えと同じことをしているでしょう。

これは、グループごとの仕組みをより明確にするために追加したものです。

+0

しかし、私の質問はなぜ私のクエリは、合計行数を持つ名前の完全なリストではなく、 "Alison 9"を返すのかについてです。 – nsledeski

+0

@nsledeski - 私は今あなたの質問を理解します – Hogan

+0

素晴らしい答えを、編集を参照してください、ありがとう! – nsledeski

0
Select name, Count(*) as 'CountCustomers' 
FROM CUSTOMER 
Group by name 
Order by name 

どのフィールドを集計するかを指示すると考えてください。たとえば、顧客の状態を持つフィールドがある場合は、状態ごとに顧客を集計する国別にグループ化することができます。また

は、あなたが構築物「によってオーバー(パーティション」を使用して選択し、同じに複数の集計関数を持つことができます注意してください。

+0

これは間違って、与えられた顧客がテーブル内にある行数を与えるだろう - 正確にOPが解決を求めていた問題。 – Hogan

0

あなたは顧客の番号と共に名をしたい場合は、ウィンドウを使用します機能:

select name, count(*) as NumCustomersWithName, 
     sum(count(*)) over() as NumCustomers 
from customer 
group by name; 

編集:

は、あなたが実際にしたいように見える:

select name, count(*) over() as NumCustomers 
from customer; 

MySQLでは、サブクエリでこれを行うだろう:それは正確に一つの行を返す集約クエリですので

select name, cnt 
from customers cross join 
    (select count(*) as cnt from customers) x; 

クエリが動作しない理由はあります。 GROUP BYのない集計関数を使用すると、問合せは常に1つの行を返します。

+0

私の質問は、正しい結果を見つける方法ではないので、私の元のコードが間違ったものを返す理由です。 – nsledeski

+0

@nsledeski。 。 。あなたが実際に望んでいる結果は何ですか?サンプルデータと望ましい結果が得られます。 –

+0

申し訳ありませんが、私は例を使って投稿を更新しました! – nsledeski

関連する問題