Database

[SQL Server]データを期間別に集計する

sqlserer Database

SQL Serverで日・週・月・年別の集計表を出力する方法

SQL Serverでは、DATETIME型で管理している日付データを CONVERT関数やDATEPART関数を活用することで、 日次・週次・月次・年次の集計結果を簡単に出力できます。 本記事では、それぞれの集計方法をサンプルクエリとともに解説します。

⚠ 注意:週次集計は「日曜日」始まり
DATEPART(WEEK, ...)を使用した週次集計は、デフォルトで日曜日が週の開始日となります。 月曜日始まりにしたい場合は、SET DATEFIRST 1を事前に設定してください。

集計方法一覧

集計には主に2つのアプローチがあります。

  • CONVERT関数:日付を文字列に変換してグループ化する方法
  • DATEPART関数:年・月・日などの数値を個別に取得してグループ化する方法

① 日次集計

1日単位で件数を集計します。

-- 日次集計(CONVERT を使用)
-- 書式コード 111 は「yyyy/mm/dd」形式で出力
SELECT
    CONVERT(VARCHAR, 日付, 111) AS 日次
  , COUNT(*)                   AS 件数
FROM テーブル名
GROUP BY CONVERT(VARCHAR, 日付, 111)
ORDER BY 日次;
-- 日次集計(DATEPART を使用)
-- 年・月・日を個別の列として取得
SELECT
    DATEPART(YEAR,  日付) AS 年
  , DATEPART(MONTH, 日付) AS 月
  , DATEPART(DAY,   日付) AS 日
  , COUNT(*)              AS 件数
FROM テーブル名
GROUP BY
    DATEPART(YEAR,  日付)
  , DATEPART(MONTH, 日付)
  , DATEPART(DAY,   日付)
ORDER BY 年, 月, 日;

② 週次集計

1週間単位で件数を集計します。
DATEPART(WEEK, ...)年をまたぐ場合に週番号がリセットされるため、 年をまたぐ集計ではDATEPART(YEAR, ...)を組み合わせることを推奨します。

-- 週次集計(DATEPART を使用)※日曜日始まり
-- 年をまたぐ場合に備えて YEAR も併せて取得
SELECT
    DATEPART(YEAR, 日付) AS 年
  , DATEPART(WEEK, 日付) AS 週番号
  , COUNT(*)             AS 件数
FROM テーブル名
GROUP BY
    DATEPART(YEAR, 日付)
  , DATEPART(WEEK, 日付)
ORDER BY 年, 週番号;
💡 月曜日始まりにする場合
クエリの前に以下を実行することで、週の開始日を月曜日に変更できます。

SET DATEFIRST 1; -- 1:月曜, 7:日曜(デフォルト)

③ 月次集計

1か月単位で件数を集計します。

-- 月次集計(CONVERT を使用)
-- SUBSTRING で「yyyy/mm」の7文字を切り出してグループ化
SELECT
    SUBSTRING(CONVERT(VARCHAR, 日付, 111), 1, 7) AS 年月
  , COUNT(*)                                      AS 件数
FROM テーブル名
GROUP BY SUBSTRING(CONVERT(VARCHAR, 日付, 111), 1, 7)
ORDER BY 年月;
-- 月次集計(DATEPART を使用)
SELECT
    DATEPART(YEAR,  日付) AS 年
  , DATEPART(MONTH, 日付) AS 月
  , COUNT(*)              AS 件数
FROM テーブル名
GROUP BY
    DATEPART(YEAR,  日付)
  , DATEPART(MONTH, 日付)
ORDER BY 年, 月;

④ 年次集計

1年単位で件数を集計します。

-- 年次集計(CONVERT を使用)
-- SUBSTRING で「yyyy」の4文字を切り出してグループ化
SELECT
    SUBSTRING(CONVERT(VARCHAR, 日付, 111), 1, 4) AS 年
  , COUNT(*)                                      AS 件数
FROM テーブル名
GROUP BY SUBSTRING(CONVERT(VARCHAR, 日付, 111), 1, 4)
ORDER BY 年;
-- 年次集計(DATEPART を使用)
SELECT
    DATEPART(YEAR, 日付) AS 年
  , COUNT(*)             AS 件数
FROM テーブル名
GROUP BY DATEPART(YEAR, 日付)
ORDER BY 年;

まとめ

集計単位 CONVERT を使う場合 DATEPART を使う場合
日次 CONVERT(VARCHAR, 日付, 111) YEAR / MONTH / DAY を個別に指定
週次 YEAR / WEEK を組み合わせて指定
月次 SUBSTRING(..., 1, 7) で年月を切り出し YEAR / MONTH を個別に指定
年次 SUBSTRING(..., 1, 4) で年を切り出し YEAR のみ指定

シンプルに出力したい場合はCONVERT、 集計結果を数値として後続処理で扱いたい場合はDATEPARTを選ぶと良いでしょう。

タイトルとURLをコピーしました