データベースを使いこなそう!SQLで月と年ごとにデータをグルーピングする方法

2024-06-05

SQL で月と年ごとにグループ化する方法

売上データのテーブル sales があり、date 列に日付情報、amount 列に売上金額が格納されているとします。 このテーブルを月と年ごとにグループ化し、売上合計額を求めるには、以下のクエリを実行します。

SELECT
  YEAR(date) AS year,
  MONTH(date) AS month,
  SUM(amount) AS total_sales
FROM sales
GROUP BY YEAR(date), MONTH(date)
ORDER BY year, month;

解説

  • YEAR(date)date 列の年を抽出します。
  • SUM(amount)amount 列の値を合計します。
  • GROUP BY YEAR(date), MONTH(date)YEAR(date)MONTH(date) の値ごとにグループ化します。
  • ORDER BY year, month:結果を年と月の昇順でソートします。

その他の集計関数

SUM 以外にも、AVG (平均)、MIN (最小値)、MAX (最大値) などの集計関数を使用できます。 例えば、売上平均を求めるには、以下のように AVG 関数を使用します。

SELECT
  YEAR(date) AS year,
  MONTH(date) AS month,
  AVG(amount) AS average_sales
FROM sales
GROUP BY YEAR(date), MONTH(date)
ORDER BY year, month;

注意事項

  • グループ化する列は、数値型である必要はありません。 文字列列をグループ化することもできます。
  • 複数の列をグループ化するには、, で区切って列を指定します。 例えば、顧客 ID と国ごとにグループ化するには、以下のようにします。
SELECT
  customer_id,
  country,
  SUM(amount) AS total_sales
FROM sales
GROUP BY customer_id, country
ORDER BY customer_id, country;

SQL Server 以外のデータベース

上記のクエリは、SQL Server 以外にも、MySQL、PostgreSQL などの主要なデータベースでほぼ同様に動作します。 ただし、データベースによっては、集計関数の名前や構文がわずかに異なる場合があります。




    -- サンプルデータの作成
    CREATE TABLE sales (
      id INT IDENTITY PRIMARY KEY,
      date DATE NOT NULL,
      amount DECIMAL(10,2) NOT NULL
    );
    
    INSERT INTO sales (date, amount) VALUES
      ('2023-01-10', 100.00),
      ('2023-01-20', 50.00),
      ('2023-02-15', 120.00),
      ('2023-02-22', 80.00),
      ('2023-03-10', 150.00),
      ('2023-03-25', 60.00);
    
    -- 月と年ごとに売上合計額をグループ化して表示
    SELECT
      YEAR(date) AS year,
      MONTH(date) AS month,
      SUM(amount) AS total_sales
    FROM sales
    GROUP BY YEAR(date), MONTH(date)
    ORDER BY year, month;
    

    このコードは、以下の操作を実行します。

    1. sales という名前のテーブルを作成します。 このテーブルには、iddateamount という 3 つの列があります。
    2. サンプルデータを sales テーブルに挿入します。 このデータは、2023 年 1 月から 3 月までの売上を表します。
    3. sales テーブルを月と年ごとにグループ化し、売上合計額を計算します。
    4. 結果を年と月の昇順でソートします。

    実行結果

    year | month | total_sales
    ------- | -------- | --------
    2023 | 1 | 150.00
    2023 | 2 | 200.00
    2023 | 3 | 210.00
    

    この結果は、2023 年 1 月の売上合計額が 150 ドル、2 月の売上合計額が 200 ドル、3 月の売上合計額が 210 ドルであることを示しています。




    SQL で月と年ごとにグループ化する方法:その他の方法

    CASE 式を使用して、日付列を月と年の値に変換してから、GROUP BY 句でグループ化できます。

    SELECT
      CASE
        WHEN MONTH(date) = 1 THEN 'January'
        WHEN MONTH(date) = 2 THEN 'February'
        ...
        ELSE MONTH(date)
      END AS month_name,
      YEAR(date) AS year,
      SUM(amount) AS total_sales
    FROM sales
    GROUP BY CASE
          WHEN MONTH(date) = 1 THEN 'January'
          WHEN MONTH(date) = 2 THEN 'February'
          ...
          ELSE MONTH(date)
        END,
      YEAR(date)
    ORDER BY year, month_name;
    
    SELECT
      y.year,
      m.month,
      SUM(amount) AS total_sales
    FROM sales s
    JOIN (
      SELECT DISTINCT YEAR(date) AS year
      FROM sales
    ) AS y
    ON s.YEAR(date) = y.year
    JOIN (
      SELECT DISTINCT MONTH(date) AS month
      FROM sales
    ) AS m
    ON s.MONTH(date) = m.month
    GROUP BY y.year, m.month
    ORDER BY y.year, m.month;
    

    ピボットテーブルを使用する

    多くのデータベース管理システムには、ピボットテーブルというツールが組み込まれています。 ピボットテーブルを使用すると、データを簡単にグループ化して集計できます。

    各方法の比較

    方法利点欠点
    GROUP BY 句と集計関数を使用するシンプルでわかりやすい月の名前を取得するには、CASE 式を使用する必要がある
    CASE 式を使用する月の名前を取得しやすい構文が少し複雑になる
    集計関数とサブクエリを使用する柔軟性が高い構文が複雑になる
    ピボットテーブルを使用する使いやすいデータベース管理システムによって機能が異なる

    どの方法を選択するかは、状況によって異なります。 シンプルでわかりやすい方法が必要な場合は、GROUP BY 句と集計関数を使用する方法がおすすめです。 月の名前を取得する必要がある場合は、CASE 式を使用する方法がおすすめです。 より柔軟な方法が必要な場合は、集計関数とサブクエリを使用する方法がおすすめです。 使いやすい方法が必要な場合は、ピボットテーブルを使用する方法がおすすめです。


    sql sql-server


    SQL Serverで一時テーブルにIDENTITYフィールドを作成しながら挿入する方法

    方法1:INSERT INTO . .. SELECT. ..構文を使用するこの方法は、SELECTステートメントの結果に基づいて一時テーブルを作成し、IDENTITYフィールドを自動的に生成します。方法2:EXEC sp_executesqlを使用する...


    データベース監査、Extended Events、ログファイルなどを活用した特定のデータベースイベントの表示方法

    SQL Server Profiler は、SQL Server インスタンスに対するアクティビティをトレースする強力なツールです。しかし、多くの場合、膨大な量のデータが生成されるため、特定のデータベースからのイベントのみを表示したい場合があります。...


    初心者向け: SQL Serverでストアドプロシージャの存在を確認する方法

    ここでは、ストアドプロシージャが存在するかどうかを確認する3つの方法を紹介します。sys. objects カタログビューには、データベース内のすべてのオブジェクトに関する情報が格納されています。このビューを使用して、ストアドプロシージャの名前とタイプに基づいて存在を確認できます。...


    ユーザーに権限を付与する

    このエラーメッセージは、SQL Server 2012でユーザーまたはアプリケーションがデータベースにアクセスしようとするときに発生します。このエラーが発生する理由はいくつか考えられますが、最も一般的な原因は以下の3つです。権限不足: ユーザーまたはアプリケーションに、アクセスしようとしているデータベースに必要な権限が与えられていない可能性があります。...


    SQLにおけるarray_agg関数の重複処理:DISTINCT、GROUP BY、ウィンドウ関数を使いこなす

    この問題を解決するには、いくつかの方法があります。DISTINCTキーワードを使用する最も簡単な方法は、DISTINCTキーワードを使用することです。これは、array_agg関数によって生成された配列から重複した要素を自動的に削除します。...