SQLで月ごとのデータを抽出する方法とテクニック

SQLを使って月単位でデータを抽出・集計する方法について、実践的なコード例と共に解説します。初心者でも理解できる基本的な構文から、より高度な集計方法まで、どのように使い分ければよいのでしょうか?

SQLで月ごとのデータ抽出と集計の基本

SQLによる月次データ抽出の重要ポイント
📊
日付関数の活用

DATE_FORMAT、EXTRACT、DATEPARTなどの日付関数を使用して月単位の抽出が可能です

🔍
集計関数との組み合わせ

GROUP BY句とSUM、COUNT、AVG関数を組み合わせて月次集計を実現

パフォーマンス最適化

インデックスの活用と適切な日付型の選択でクエリの実行速度を向上

基本的な月次データの抽出方法

MySQLでは、DATE_FORMAT関数を使用して月単位でデータを抽出できます。以下は基本的な構文例です:


SELECT 
    DATE_FORMAT(created_at, '%Y-%m') AS month,
    COUNT(*) as count,
    SUM(amount) as total_amount
FROM 
    sales_table
GROUP BY 
    DATE_FORMAT(created_at, '%Y-%m')
ORDER BY 
    month

 

このクエリは売上データを月ごとに集計し、件数と合計金額を表示します。

データベース別の月次抽出テクニック

各データベースで使用できる月次抽出の方法は異なります:


-- MySQL/MariaDB
SELECT EXTRACT(MONTH FROM date_column) AS month
-- SQL Server
SELECT DATEPART(MONTH, date_column) AS month
-- PostgreSQL
SELECT date_trunc('month', date_column) AS month

 

特にSQL Serverでは、DATEPARTを使用することで年と月を別々に抽出できる特徴があります。

月次データのサブクエリ活用術

より複雑な集計には、サブクエリを活用します:


SELECT 
    ym,
    SUM(daily_total) as monthly_total
FROM (
    SELECT 
        DATE_FORMAT(sale_date, '%Y-%m') as ym,
        SUM(amount) as daily_total
    FROM 
        sales
    GROUP BY 
        sale_date
) tmp
GROUP BY 
    ym

 

このアプローチにより、日次データを月次データに変換しながら、複数の集計処理を行うことができます。

パフォーマンスを考慮した月次抽出の最適化

大量のデータを扱う場合、以下の点に注意が必要です:

  • インデックスの作成:日付カラムにインデックスを設定
  • パーティショニングの活用:月単位でテーブルを分割
  • 適切なデータ型の選択:DATETIME型やTIMESTAMP型の使い分け

-- インデックス作成例
CREATE INDEX idx_date ON sales_table(created_at)
-- パーティショニング例
PARTITION BY RANGE (YEAR(created_at)) (
    PARTITION p2023 VALUES LESS THAN (2024),
    PARTITION p2024 VALUES LESS THAN (2025)
)

月次データの高度な集計テクニック

より詳細な分析のための高度な集計方法を紹介します:


-- 前月比の計算
SELECT 
    current_month,
    sales_amount,
    LAG(sales_amount) OVER (ORDER BY current_month) as prev_month_sales,
    (sales_amount - LAG(sales_amount) OVER (ORDER BY current_month)) / 
    LAG(sales_amount) OVER (ORDER BY current_month) * 100 as growth_rate
FROM (
    SELECT 
        DATE_FORMAT(sale_date, '%Y-%m') as current_month,
        SUM(amount) as sales_amount
    FROM 
        sales
    GROUP BY 
        DATE_FORMAT(sale_date, '%Y-%m')
) monthly_sales

 

このクエリでは、ウィンドウ関数を使用して前月比や成長率を計算しています。