3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援→開発戻り浦島太郎状態の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。

(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 │

└──┴──┴──┘