人気ブログランキング | 話題のタグを見る
(SQL)グループ化したものを重複なしで数えるSQL(COUNT DISTINCT)
3流プログラマ苦手な SQL のメモです。

このようなテーブルがあるとします。

┌─────┬───┬──┬────┐
│CustomerID│LineNo│Sex │AgeBy │
├─────┼───┼──┼────┤
│3 │1 │1 │30 │
├─────┼───┼──┼────┤
│3 │2 │1 │30 │
├─────┼───┼──┼────┤
│3 │3 │1 │30 │
├─────┼───┼──┼────┤
│4 │1 │2 │40 │
├─────┼───┼──┼────┤
│4 │2 │2 │40 │
├─────┼───┼──┼────┤
│4 │3 │2 │40 │
├─────┼───┼──┼────┤
│5 │1 │1 │30 │
├─────┼───┼──┼────┤
│6 │1 │2 │20 │
├─────┼───┼──┼────┤
│7 │1 │1 │ │
├─────┼───┼──┼────┤
│8 │1 │2 │20 │
└─────┴───┴──┴────┘



このとき、男女・年齢別の人数(同じCustomerIDのデータは1件としてカウント)を出す時の SQL は SQL Sever とか Oracle の場合は下記のようにしたらできます。

SELECT COUNT(DISTINCT CustomerID) , Sex , Age
FROM Sales
GROUP BY CustomerID , Sex , Age



しかし今開発で使う JET(Access,MDB) では COUNT(DISTINCT フィールド)が使えないようです。

ということで副問い合わせを使うことで、JET(Access,MDB) でも使えるようにしたのが下記です。

SELECT COUNT(*) AS Num ,
Sex2 ,
Age2
FROM
( SELECT DISTINCT CustomerID ,
Sex AS Sex2 ,
Age   AS Age2
FROM Sales
GROUP BY CustomerID ,
Sex ,
Age 
)

GROUP BY Sex2 ,
Age2

やはり、AecessのSQLはいかんですね。使えない構文多すぎ。。

結果はこうなります。

┌──┬──┬──┐
│Num │Sex2│Age2│
├──┼──┼──┤
│1 │1 │ │
├──┼──┼──┤
│2 │1 │30 │
├──┼──┼──┤
│2 │2 │20 │
├──┼──┼──┤
│1 │2 │40 │
└──┴──┴──┘

by jehoshaphat | 2009-03-06 19:29 | SQL | Comments(0)


<< (.Net)VisualStu... SEOにも役立つGoogleキ... >>