SQLでCOUNT と CASE 式を使って条件に応じたデータのカウント方法

SQLのCOUNT関数とCASE式を組み合わせることで、特定の条件に基づいたデータのカウントを効率的に行うことができます。これにより、単純なカウント以上の柔軟な集計が可能になります。本記事では、COUNT関数とCASE式の基本を理解し、具体的なSQLクエリ例を通じて実際の使用方法を学びます。

目次

COUNT関数の基本

COUNT関数は、SQLでデータベース内の行数をカウントするために使用されます。基本的な使い方として、全行数や特定の列に値が存在する行数を取得することができます。

全行数をカウントする

テーブル内のすべての行をカウントするには、次のようにCOUNT(*)を使用します。

SELECT COUNT(*) FROM テーブル名;

特定の列の値をカウントする

特定の列に値が存在する行をカウントするには、COUNT(列名)を使用します。NULL値はカウントされません。

SELECT COUNT(列名) FROM テーブル名;

CASE式の基本

CASE式は、SQLで条件に応じた異なる値を返すために使用される条件式です。IF-THEN-ELSE文に似た構文で、特定の条件が満たされた場合に特定の値を返し、そうでない場合に別の値を返すことができます。

CASE式の構文

CASE式の基本構文は次の通りです。

CASE
    WHEN 条件1 THEN 結果1
    WHEN 条件2 THEN 結果2
    ...
    ELSE 結果N
END

各条件が順に評価され、最初に真となった条件の結果が返されます。すべての条件が偽の場合、ELSE部分の結果が返されます。ELSEが省略された場合、すべての条件が偽であればNULLが返されます。

簡単な例

たとえば、従業員の給与を評価して、特定の範囲に応じて評価を与える場合、次のようにCASE式を使用します。

SELECT 名前,
       CASE
           WHEN 給与 >= 100000 THEN '高'
           WHEN 給与 >= 50000 THEN '中'
           ELSE '低'
       END AS 給与評価
FROM 従業員;

この例では、給与が100000以上の場合に「高」、50000以上の場合に「中」、それ以外の場合に「低」という評価を返します。

COUNTとCASE式の組み合わせ方

COUNT関数とCASE式を組み合わせることで、特定の条件に基づいたデータのカウントが可能になります。これにより、単一のクエリで複数の条件を一度に評価して集計することができます。

条件に応じたカウントの基本構文

COUNT関数とCASE式を組み合わせる基本構文は次の通りです。

SELECT
    COUNT(CASE WHEN 条件1 THEN 1 END) AS 条件1のカウント,
    COUNT(CASE WHEN 条件2 THEN 1 END) AS 条件2のカウント
FROM テーブル名;

この構文では、各条件に応じた行数を個別にカウントします。CASE式が真の場合に1を返し、それをCOUNT関数でカウントします。

具体例

たとえば、顧客テーブルから男性と女性の顧客数をそれぞれカウントする場合、次のようにします。

SELECT
    COUNT(CASE WHEN 性別 = '男性' THEN 1 END) AS 男性のカウント,
    COUNT(CASE WHEN 性別 = '女性' THEN 1 END) AS 女性のカウント
FROM 顧客;

この例では、性別が「男性」の行と「女性」の行をそれぞれカウントします。

複数条件のカウント

さらに複数の条件を組み合わせることで、より詳細なカウントが可能です。たとえば、製品のステータスが「販売中」と「販売終了」の数をカウントする場合は次のようにします。

SELECT
    COUNT(CASE WHEN ステータス = '販売中' THEN 1 END) AS 販売中の数,
    COUNT(CASE WHEN ステータス = '販売終了' THEN 1 END) AS 販売終了の数
FROM 製品;

このようにして、特定の条件に基づくデータの集計が簡単に行えます。

実際のSQLクエリ例

ここでは、COUNT関数とCASE式を組み合わせて特定の条件に応じたデータをカウントする具体的なSQLクエリの例を紹介します。これにより、実際のデータベース操作でどのように活用できるかを理解できます。

例1: 顧客の年齢層ごとのカウント

顧客テーブルから年齢層ごとに顧客数をカウントするクエリです。

SELECT
    COUNT(CASE WHEN 年齢 < 20 THEN 1 END) AS '20歳未満',
    COUNT(CASE WHEN 年齢 BETWEEN 20 AND 29 THEN 1 END) AS '20代',
    COUNT(CASE WHEN 年齢 BETWEEN 30 AND 39 THEN 1 END) AS '30代',
    COUNT(CASE WHEN 年齢 BETWEEN 40 AND 49 THEN 1 END) AS '40代',
    COUNT(CASE WHEN 年齢 >= 50 THEN 1 END) AS '50歳以上'
FROM 顧客;

このクエリでは、顧客の年齢に応じて5つの年齢層に分類し、それぞれの顧客数をカウントしています。

例2: 製品ステータスごとのカウント

製品テーブルから、各製品のステータスごとに数をカウントするクエリです。

SELECT
    COUNT(CASE WHEN ステータス = '在庫あり' THEN 1 END) AS '在庫あり',
    COUNT(CASE WHEN ステータス = '在庫切れ' THEN 1 END) AS '在庫切れ',
    COUNT(CASE WHEN ステータス = '販売終了' THEN 1 END) AS '販売終了'
FROM 製品;

このクエリでは、製品のステータスが「在庫あり」、「在庫切れ」、「販売終了」のそれぞれの場合の数をカウントしています。

例3: 注文ステータスごとのカウント

注文テーブルから、注文のステータスごとに数をカウントするクエリです。

SELECT
    COUNT(CASE WHEN ステータス = '新規' THEN 1 END) AS '新規注文',
    COUNT(CASE WHEN ステータス = '処理中' THEN 1 END) AS '処理中の注文',
    COUNT(CASE WHEN ステータス = '完了' THEN 1 END) AS '完了した注文'
FROM 注文;

このクエリでは、注文のステータスが「新規」、「処理中」、「完了」のそれぞれの場合の数をカウントしています。

応用例

COUNT関数とCASE式の組み合わせは、さらに複雑な条件でのデータ集計にも応用できます。ここでは、実務で役立ついくつかの応用例を紹介します。

例1: 顧客の購入状況に基づくカウント

顧客テーブルと購入履歴テーブルを使用して、顧客が過去1年に購入したかどうかに基づいて顧客数をカウントします。

SELECT
    COUNT(CASE WHEN 購入日 >= DATEADD(YEAR, -1, GETDATE()) THEN 1 END) AS '過去1年に購入した顧客',
    COUNT(CASE WHEN 購入日 < DATEADD(YEAR, -1, GETDATE()) OR 購入日 IS NULL THEN 1 END) AS '過去1年に購入していない顧客'
FROM 顧客 LEFT JOIN 購入履歴 ON 顧客.顧客ID = 購入履歴.顧客ID;

このクエリでは、購入日が過去1年以内の顧客と、それ以外の顧客をカウントしています。

例2: 商品カテゴリごとの売上カウント

商品カテゴリごとの売上数をカウントするクエリです。売上テーブルと商品テーブルを結合して集計します。

SELECT
    商品カテゴリ,
    COUNT(CASE WHEN 売上金額 > 0 THEN 1 END) AS '売上数'
FROM 売上
JOIN 商品 ON 売上.商品ID = 商品.商品ID
GROUP BY 商品カテゴリ;

このクエリでは、商品カテゴリごとに売上が発生した商品の数をカウントしています。

例3: 複数条件でのカウント

複数の条件を組み合わせてデータをカウントするクエリです。例えば、顧客の年齢層ごとの購入状況をカウントします。

SELECT
    COUNT(CASE WHEN 年齢 < 20 AND 購入日 IS NOT NULL THEN 1 END) AS '20歳未満の購入顧客',
    COUNT(CASE WHEN 年齢 BETWEEN 20 AND 29 AND 購入日 IS NOT NULL THEN 1 END) AS '20代の購入顧客',
    COUNT(CASE WHEN 年齢 BETWEEN 30 AND 39 AND 購入日 IS NOT NULL THEN 1 END) AS '30代の購入顧客',
    COUNT(CASE WHEN 年齢 BETWEEN 40 AND 49 AND 購入日 IS NOT NULL THEN 1 END) AS '40代の購入顧客',
    COUNT(CASE WHEN 年齢 >= 50 AND 購入日 IS NOT NULL THEN 1 END) AS '50歳以上の購入顧客'
FROM 顧客 LEFT JOIN 購入履歴 ON 顧客.顧客ID = 購入履歴.顧客ID;

このクエリでは、顧客の年齢層ごとに購入履歴がある顧客数をカウントしています。

まとめ

COUNT関数とCASE式を組み合わせることで、SQLで特定の条件に基づいたデータのカウントが効率的に行えます。この方法は、単純な集計だけでなく、複数の条件を一度に評価してデータを詳細に分析する際にも非常に有用です。具体的なクエリ例を通じて、年齢層ごとの顧客数や製品ステータスごとのカウントなど、実際のデータベース操作でどのように活用できるかを学びました。これらのテクニックを活用することで、より高度なデータ分析とレポート作成が可能になります。

コメント

コメントする

目次