SQL DISTINCT文で重複データをカウントせずに集計する
「社員マスタ」と「売上明細」と「会社マスタ」というテーブルがあります。売上明細テーブルには、社員の売上情報が格納されています。
「売上明細」は「会社コード」のカラムを持ち、どこの会社(取引先)からの売上か、という情報を持っています。
社員コード | 社員名 | 部署コード | 年齢 |
---|---|---|---|
1 | テスト社員1 | 1 | 22 |
2 | テスト社員2 | 2 | 30 |
3 | テスト社員3 | null | 20 |
4 | テスト社員4 | 2 | 30 |
売上NO | 社員コード | 売上日 | 売上金額 | 会社コード |
---|---|---|---|---|
1 | 1 | 20150401 | 200 | 1 |
2 | 1 | 20150402 | 300 | 1 |
3 | 2 | 20150408 | 100 | 1 |
4 | 2 | 20150501 | 150 | 2 |
5 | 3 | 20150505 | 550 | 2 |
会社コード | 会社名 |
---|---|
1 | テスト会社1 |
2 | テスト会社2 |
3 | テスト会社3 |
社員ごとに、売上のある会社の社数を表示したい。
SQLは下記のようになります。
SELECT MAX(T1.社員名) AS 社員名
,COUNT(DISTINCT T3.会社コード) AS 売上社数
FROM 社員マスタ AS T1
LEFT JOIN 売上明細 AS T2
ON T1.社員コード = T2.社員コード
LEFT JOIN 会社マスタ AS T3
ON T2.会社コード = T3.会社コード
GROUP BY T1.社員コード
社員名 | 売上社数 |
---|---|
テスト社員1 | 1 |
テスト社員2 | 2 |
テスト社員3 | 1 |
テスト社員4 | 0 |
重複するデータを1カウントとして集計したい場合はCOUNT
の集計関数にDISTINCT
を追加します。
今回はCOUNT
の集計関数でDISTINCT
を使用しましたが、SUM
などの他の集計関数でも使用することができます。
試しにDISTINCT
を使用せずに実行した場合を見てみます。
SELECT MAX(T1.社員名) AS 社員名
,COUNT(T3.会社コード) AS 売上社数
FROM 社員マスタ AS T1
LEFT JOIN 売上明細 AS T2
ON T1.社員コード = T2.社員コード
LEFT JOIN 会社マスタ AS T3
ON T2.会社コード = T3.会社コード
GROUP BY T1.社員コード
社員名 | 売上社数 |
---|---|
テスト社員1 | 2 |
テスト社員2 | 2 |
テスト社員3 | 1 |
テスト社員4 | 0 |
テスト社員1の売上社数について、DISTINCT
を使用せずに集計した場合、COUNT
の集計関数は対象データ件数を出力するため、テスト社員1の売上明細は2件あるので、売上社数は2と表示されてしまいます。
テスト社員1の売上明細の会社コードは2件とも1なので、DISTINCT
を使用してCOUNT
すると、重複した値は1カウントとして扱われるため、売上社数が1と表示されます。