2017-11-15 7 views
0

による凝集による私は現在、このようなSQLクエリを書かれている:SQL複数のグループ最初のグループ

SELECT a, b, count(id)/???? 
FROM  X 
group by a, b 

に注意してください?????上記コードの group byには2つのグループがあります。つまり、列abです。

は私は何をしようとすると、最初のグループ(a)内のアイテムの(2)カウントする第二群(b)内のアイテムの(1)カウントを分割することです。

count(id)は(1)を達成します。しかし、私は何のために書くべきか分からない(2)。

P .:私は知っていますが、 "????"別の複雑な選択クエリを使用して、私はより簡単な方法がある場合は最初のグループの項目aggregateを学びたいと思います。

更新: サンプルデータ:

id  a   b 
______________________ 
1  'A'   'G' 
2  'A'   'H' 
3  'A'   'H' 
4  'B'   'G' 
5  'B'   'G' 
6  'B'   'K' 
7  'B'   'K' 

結果は:

a   b   [unnamed] 
________________________________ 
'A'   'G'  0.33333 
'A'   'H'  0.66667 
'B'   'G'  0.5 
'B'   'K'  0.5 

第3列は、列の値に列Bの相対のような値を持つ列の割合です。

ありがとうございます。

+1

編集をあなたの質問を使用して、サンプルデータと望ましい結果を提供している場合は多分これは動作します。最初のグループは何ですか?第二のグループとは何ですか? –

+0

まず、私が学んだ 'count(*)'はあなたが望むものではなく、すべてのカラムを選択し、大きなテーブルでは、これがパフォーマンスヒットになる可能性があります。 'eventid'が存在し、あなたの主キーであると仮定して' count(eventid) 'に切り替えることができます。 – Roland

+0

はい@Roland。 count(eventid)が正しい。しかし、私はcount(*)をテストしても同じ動作しています。私はそれをより明確にするために質問を編集しています。 –

答えて

2

は、SQL Server

SELECT DISTINCT a, b, (COUNT(*)OVER(PARTITION BY a, b)* 1.0/COUNT(*)OVER(PARTITION BY a)) as unnamed 
FROM Sample 
+0

私はそれを試して、それは動作するようです。私は質問を編集したので、列名を変更して質問に合致するようにすることができますか? –

+0

その前に 'EXPLAIN'を試して、それがどのように実行されているか確認できますか?私はあなたのDBMSがこれをサポートすることを願っています – Roland

+0

@AliJey編集: – LONG

2
select A.a, B.b, a.num, b.num, CAST(b.num as float)/cast(a.num as float) 
from 
(select a, count(*) as num 
from @table 
group by a) as A 
join 
(select a, b, count(*) as num 
from @table 
group by a, b) as B on A.a = B.a 
+0

あなたのコードの回りにバックティックを使用してください。 SELECT foo FROM barと同様です。 – Roland

+0

ありがとうございます。 – Roland