SQL DISTINCT文で重複データをカウントせずに集計する

「社員マスタ」と「売上明細」と「会社マスタ」というテーブルがあります。売上明細テーブルには、社員の売上情報が格納されています。

「売上明細」は「会社コード」のカラムを持ち、どこの会社(取引先)からの売上か、という情報を持っています。

社員マスタ
社員コード社員名部署コード年齢
1テスト社員1122
2テスト社員2230
3テスト社員3null20
4テスト社員4230
売上明細
売上NO社員コード売上日売上金額会社コード
11201504012001
21201504023001
32201504081001
42201505011502
53201505055502
会社マスタ
会社コード会社名
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.社員コード
実行結果
社員名売上社数
テスト社員11
テスト社員22
テスト社員31
テスト社員40

重複するデータを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.社員コード
実行結果
社員名売上社数
テスト社員12
テスト社員22
テスト社員31
テスト社員40

テスト社員1の売上社数について、DISTINCTを使用せずに集計した場合、COUNTの集計関数は対象データ件数を出力するため、テスト社員1の売上明細は2件あるので、売上社数は2と表示されてしまいます。

テスト社員1の売上明細の会社コードは2件とも1なので、DISTINCTを使用してCOUNTすると、重複した値は1カウントとして扱われるため、売上社数が1と表示されます。


関連記事

  • SQL WITH句でVIEWを作成し重複するSQL文をまとめる

    WITH句でVIEWを作成し重複するSQL文をまとめる方法を説明します。WITH句を使えば1つの副問い合わせ(SQL)を複数の箇所で使いまわすことができます。


  • SQL WHERE句でデータを絞り込む

    WHERE句でデータを絞り込む方法について説明します。取得するデータを絞り込むには、WHERE句で条件を指定します。


  • SQL UPDATE文でデータを更新する

    UPDATE文でデータベースに新しいデータを更新する方法を紹介します。自身の値を参照する方法や、副問い合わせの結果をUPDATEする方法も合わせて紹介します。副問い合わせの結果を更新する場合、SETす...


  • SQL 副問い合わせの基本を理解する

    副問い合わせを説明します。副問い合わせとはSQL文の中に入れ子でSQL文を指定することをいいます。


  • SQL SELECT句の基本的な使い方

    SELECT句の基本的な使い方について説明します。


  • SQL SELECTした結果をINSERTで登録する

    SELECT-INSERT文なら、SELECTしたデータをそのまま一気にまとめて登録できるので、実装も簡単ですのでおすすめです。件数分ループでSQLを実行するよりも1回のSQLで一気にまとめて処理でき...


  • SQL ORACLEのROWNUMで行番号を取得する際の注意点

    oracleで行番号を取得する際の基本的な考え方と注意点を紹介します。行番号はROWNUMで取得することができます。注意しなければならないのは、ORDER BYでソートする場合です。ORDER BYは...


  • SQL ROLLUP文で小計行・合計行を出力する (oracle, sql server)

    「社員マスタ」と「売上明細」というテーブルがあります。売上明細テーブルには、社員の売上情報が格納されています。社員ごとに、会社ごとの売上合計を表示し、社員ごとにすべての会社の小計行も出力したい、また最...


  • SQL チューニングでレスポンス改善に効果のあったポイント

    1回のSQLで一気にまとめて取得したほうがレスポンスは早いイメージがありますが、あまり大量のデータを扱うSQLを実行するとサーバーに負荷がかかってしまい、遅くなってしまうことがあります。


  • SQLとプログラミング言語の考え方の違い

    SQLは手続き型言語のように、上から考えるのではなく、集合を操作するという感覚で実装するとうまくいくように思います。また、上からではなく、逆に下から考えるという発送も必要だと思います。1ステップずつ実...