2016-05-22 9 views
0

見た目は良い回答がない投票済みの質問のみが見つかりました。列内に発生した割合

SQL Serverでオカレンスの割合を調べようとしています。私がやっていることの簡略化されたバージョン:

ID NAME FAVORITE_COLOR 
------------------------------------ 
    1 Jim  Blue 
    2 Tom  Green 
    3 Rob  Yellow 
    4 Kev  Blue 
    5 Kim  Green 
    6 Bev  Blue 

それぞれの数を数えることは簡単です。

SELECT 
    favorite_color, COUNT(favorite_color) AS totals 
FROM 
    color_prefs 
GROUP BY 
    favorite_color 

これは、青(など)のような3人を教えてくれます。私がどのようにするかわからないのは、パーセントを得ることです。私は、青のような人々の50%を知りたい。私は以下しようとしたが、SQLは完全にそれを嫌っ:私は私のために、このPHPのフィギュアを作ることができ、明らかに

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

が、私は方法があるように持っている:

SELECT 
    favorite_color, 
    COUNT(favorite_color)/SUM(COUNT(favorite_color)) AS color_percent 
FROM 
    color_prefs 
GROUP BY 
    favorite_color 

私はエラーを取得しますサブクエリなしでSQLでこれを行うには、そうですか?

+0

サブクエリを使用しないクエリが必要ですか? – cableload

+0

私は気にしませんが、理想的にはありません。私は2つのテーブルに加わり、日付範囲に限定しているので、実際のクエリはもう少し複雑です...しかし、それは私にとって非常に特殊です。 – jonlink

答えて

2

次の2つのways..first方法でそれを行うことができますので、効率的ではありませんが、あなたのテーブルには、多数の行が含まれていない場合、それは大丈夫でなければなりません。..

select favorite_color,count(favorite_color)*100/(select count(*) from a) 
from color_prefs 
group by favorite_color 

これが第二の方法で、より効率的な..です

select favorite_color,count(favorite_color)*100/sum(count(*)) over() 
from color_prefs 
group by favorite_color 

チェックsqlfiddle

+0

もう少し完成したので、この質問への回答を与えてください。これがどのように機能するかを理解するためには、以上のことを学ぶ必要があるようです。ありがとう! – jonlink

2

使用ウィンドウ機能:

Select color, count(*), 
     Count(*) * 1.0/sum(count(*)) over() 
From color_prefs 
Group by color; 
+0

それはそうです。しかし、なぜそれはそれをやっているのですか?私が知りたいのは、自分が何をやっているのか、これが正しいことをもっと知るべきだということです。 over()で始まるかもしれませんか? – jonlink

+0

また、ありがとうございました! – jonlink

+1

開始するには、http://sqlmag.com/sql-server-2012/how-use-microsoft-sql-server-2012s-window-functions-part-1の文書または記事を読んでください。 –

関連する問題