SQLのCASE文とSUM関数を組み合わせて条件付きの合計を算出する方法

SQLでデータを集計する際、条件に応じた合計を算出することがあります。たとえば、特定の条件を満たすデータの合計や、複数の条件に基づいた合計を求めたい場合です。CASE文とSUM関数を組み合わせることで、こうした柔軟な集計が可能になります。本記事では、その具体的な方法を詳しく解説し、条件付きの合計を算出するためのSQLクエリの書き方を学びます。

目次

CASE文とSUM関数の基本的な使い方

SQLのCASE文とSUM関数は、条件付き集計を行うための強力なツールです。まず、それぞれの基本的な使い方について理解しましょう。

CASE文の基本構文

CASE文は、特定の条件に基づいて異なる値を返すために使用します。基本構文は以下の通りです:

CASE
    WHEN 条件1 THEN 値1
    WHEN 条件2 THEN 値2
    ...
    ELSE 値N
END

この構文では、条件1が真の場合は値1を、条件2が真の場合は値2を返し、いずれの条件も満たさない場合は値Nを返します。

SUM関数の基本構文

SUM関数は、指定された列の合計を計算するために使用されます。基本構文は以下の通りです:

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

この構文では、テーブル内の指定された列の全行の合計が計算されます。

CASE文とSUM関数の組み合わせ

CASE文とSUM関数を組み合わせることで、特定の条件を満たすデータの合計を算出できます。たとえば、次のように使用します:

SELECT SUM(CASE
              WHEN 条件 THEN 値
              ELSE 0
           END) AS 条件付き合計
FROM テーブル名;

このクエリでは、条件が真の場合は値を合計し、条件が偽の場合は0を合計します。これにより、条件付きの合計が計算されます。

条件付きの合計を算出するSQLクエリの例

CASE文とSUM関数を組み合わせて条件付きの合計を算出する具体的なSQLクエリの例を見ていきましょう。

例1:特定の条件を満たすデータの合計

たとえば、売上データを管理しているテーブルがあり、特定の商品カテゴリーの売上合計を算出したい場合、次のようなクエリを使用します:

SELECT 
    SUM(CASE 
            WHEN category = 'Electronics' THEN sales_amount 
            ELSE 0 
        END) AS electronics_sales_total
FROM sales;

このクエリでは、categoryが’Electronics’の場合にsales_amountを合計し、そうでない場合は0を合計します。その結果、’Electronics’カテゴリーの売上合計が計算されます。

例2:複数の条件に基づく合計

次に、複数の条件に基づいて異なる合計を算出する例です。例えば、売上データから電子機器と衣料品のそれぞれの売上合計を求める場合、次のようなクエリを使用します:

SELECT 
    SUM(CASE 
            WHEN category = 'Electronics' THEN sales_amount 
            ELSE 0 
        END) AS electronics_sales_total,
    SUM(CASE 
            WHEN category = 'Clothing' THEN sales_amount 
            ELSE 0 
        END) AS clothing_sales_total
FROM sales;

このクエリでは、categoryが’Electronics’の場合と’Clothing’の場合でそれぞれ売上額を合計し、2つの異なる売上合計が計算されます。

例3:条件に基づく計算を含む合計

さらに、条件に基づいて異なる計算を行う場合の例を見てみましょう。例えば、ある割引が適用された売上額を合計する場合、次のようなクエリを使用します:

SELECT 
    SUM(CASE 
            WHEN discount_applied = 'Yes' THEN sales_amount * 0.9 
            ELSE sales_amount 
        END) AS total_sales_with_discount
FROM sales;

このクエリでは、discount_appliedが’Yes’の場合にsales_amountに0.9を掛けた値を合計し、割引が適用されていない場合はそのままの売上額を合計します。これにより、割引を考慮した合計売上額が計算されます。

複数の条件を用いた合計の計算方法

複数の条件を使って合計を算出する方法について、具体例を交えて解説します。これにより、より複雑な集計が可能になります。

例1:複数の条件を組み合わせた合計

例えば、特定の地域かつ特定の期間における売上の合計を求めたい場合、次のようなクエリを使用します:

SELECT 
    SUM(CASE 
            WHEN region = 'North' AND sale_date BETWEEN '2023-01-01' AND '2023-12-31' THEN sales_amount 
            ELSE 0 
        END) AS north_region_sales_2023
FROM sales;

このクエリでは、regionが’North’であり、かつsale_dateが2023年内である場合にsales_amountを合計し、それ以外の場合は0を合計します。

例2:条件ごとに異なる合計を算出

次に、異なる条件ごとに異なる合計を算出する場合の例です。例えば、特定のプロモーションが適用された場合とされていない場合の売上合計を求める場合、次のようなクエリを使用します:

SELECT 
    SUM(CASE 
            WHEN promotion_applied = 'Yes' THEN sales_amount 
            ELSE 0 
        END) AS sales_with_promotion,
    SUM(CASE 
            WHEN promotion_applied = 'No' THEN sales_amount 
            ELSE 0 
        END) AS sales_without_promotion
FROM sales;

このクエリでは、promotion_appliedが’Yes’の場合と’No’の場合でそれぞれ売上額を合計し、2つの異なる売上合計が計算されます。

例3:ネストされた条件を用いた合計

さらに、ネストされた条件を使用して合計を算出する場合の例を見てみましょう。例えば、商品の種類と売上額に応じて異なる割引率を適用し、その合計を求める場合、次のようなクエリを使用します:

SELECT 
    SUM(CASE 
            WHEN category = 'Electronics' THEN 
                CASE 
                    WHEN sales_amount > 1000 THEN sales_amount * 0.9 
                    ELSE sales_amount * 0.95 
                END
            WHEN category = 'Clothing' THEN 
                CASE 
                    WHEN sales_amount > 500 THEN sales_amount * 0.85 
                    ELSE sales_amount * 0.90 
                END
            ELSE sales_amount 
        END) AS total_sales_with_discounts
FROM sales;

このクエリでは、categoryが’Electronics’の場合に売上額に応じて異なる割引率を適用し、categoryが’Clothing’の場合にも同様に異なる割引率を適用します。条件を満たさない場合は、売上額をそのまま合計します。これにより、複雑な条件を考慮した合計が計算されます。

実践的な応用例

実際の業務シナリオでの応用例を示し、CASE文とSUM関数の実用的な活用方法を紹介します。これにより、日常のデータ集計作業に役立つ具体的な方法を理解します。

例1:月別売上合計の計算

ある企業の売上データを月ごとに集計し、月別の売上合計を求める場合、次のようなクエリを使用します:

SELECT 
    MONTH(sale_date) AS sale_month,
    SUM(sales_amount) AS monthly_sales
FROM sales
GROUP BY MONTH(sale_date)
ORDER BY sale_month;

このクエリでは、sale_dateから月を抽出し、その月ごとの売上額を合計します。結果は月別の売上合計として表示されます。

例2:部門別売上と目標達成率の計算

企業内の各部門の売上と、各部門が設定した売上目標の達成率を計算する場合、次のようなクエリを使用します:

SELECT 
    department,
    SUM(sales_amount) AS total_sales,
    SUM(sales_amount) / SUM(sales_target) * 100 AS achievement_rate
FROM sales
GROUP BY department;

このクエリでは、各部門の売上合計と売上目標の合計を計算し、達成率(売上合計を売上目標で割った値のパーセンテージ)を求めます。

例3:顧客ごとの購入金額と割引適用額の合計

顧客ごとの購入金額の合計と、割引が適用された購入金額の合計を求める場合、次のようなクエリを使用します:

SELECT 
    customer_id,
    SUM(sales_amount) AS total_purchase,
    SUM(CASE 
            WHEN discount_applied = 'Yes' THEN sales_amount 
            ELSE 0 
        END) AS discounted_purchase
FROM sales
GROUP BY customer_id;

このクエリでは、各顧客の購入金額の合計と、割引が適用された購入金額の合計を計算します。これにより、各顧客の購入行動を詳細に分析できます。

例4:商品の在庫状況と販売数の合計

在庫データと販売データを組み合わせて、商品の在庫状況と販売数の合計を求める場合、次のようなクエリを使用します:

SELECT 
    p.product_id,
    p.product_name,
    p.stock_quantity,
    SUM(s.sales_amount) AS total_sold
FROM products p
LEFT JOIN sales s ON p.product_id = s.product_id
GROUP BY p.product_id, p.product_name, p.stock_quantity;

このクエリでは、productsテーブルとsalesテーブルを結合し、各商品の在庫数と販売数の合計を計算します。これにより、在庫管理と販売実績の両方を同時に把握できます。

以上のような応用例を通じて、CASE文とSUM関数の実践的な活用方法を理解し、実際の業務シナリオで役立つスキルを身につけましょう。

まとめ

SQLのCASE文とSUM関数を組み合わせることで、条件付きの合計を柔軟に算出できる方法について解説しました。基本的な使い方から具体的なクエリ例、複数の条件を用いた合計の計算方法、実践的な応用例まで幅広く取り上げました。

CASE文を使用することで、特定の条件に応じた値を動的に返し、その結果をSUM関数で合計することが可能です。これにより、複雑なデータ集計や分析が簡単に行えるようになります。

実際の業務シナリオにおいても、月別の売上合計や部門別の売上と目標達成率、顧客ごとの購入金額と割引適用額の合計、商品の在庫状況と販売数の合計など、さまざまな場面で応用できます。

SQLを駆使して効率的なデータ分析を行い、業務の効率化や意思決定の迅速化に役立ててください。条件付きの合計を算出する技術をマスターすることで、データベースの集計操作がより強力かつ便利になります。

コメント

コメントする

目次