このようなテーブルがあるとします。
┌─────┬───┬──┬────┐
│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 │
└──┴──┴──┘