MySQL GROUP BYを使いこなして、ビジネスに役立つ分析レポートを作成しよう!

2024-04-02

MySQLで日付をグループ化して集計する方法:GROUP BYによる日/月/年別集計

本記事では、GROUP BY句を用いた日/月/年別の集計方法について、具体的な例を交えて分かりやすく解説します。

準備

まず、以下のテーブル orders を用意します。

CREATE TABLE orders (
  order_id INT,
  customer_id INT,
  order_date DATETIME,
  product_id INT,
  quantity INT,
  total_price DECIMAL(10,2)
);

このテーブルには、注文ID、顧客ID、注文日時、商品ID、数量、合計金額などの情報が含まれています。

日別集計

日別で注文数を集計するには、以下のSQLクエリを使用します。

SELECT DATE(order_date) AS order_day, COUNT(*) AS order_count
FROM orders
GROUP BY DATE(order_date);

このクエリは、**DATE(order_date)**関数を使用して、order_date列から日付のみを抽出し、order_dayという別名で出力します。

また、**COUNT(*)**関数を使用して、order_dayごとに注文数を集計し、order_countという別名で出力します。

結果例

order_day | order_count
----------+------------
2024-03-08 | 10
2024-03-09 | 15
2024-03-10 | 20

月別集計

SELECT MONTH(order_date) AS order_month, COUNT(*) AS order_count
FROM orders
GROUP BY MONTH(order_date);
order_month | order_count
------------+------------
1           | 25
2           | 30
3           | 45

年別集計

SELECT YEAR(order_date) AS order_year, COUNT(*) AS order_count
FROM orders
GROUP BY YEAR(order_date);
order_year | order_count
------------+------------
2023       | 100
2024       | 75

複数の列をグループ化

複数の列同時にグループ化することも可能です。例えば、日別商品ID別に注文数を集計するには、以下のSQLクエリを使用します。

SELECT DATE(order_date) AS order_day, product_id, COUNT(*) AS order_count
FROM orders
GROUP BY DATE(order_date), product_id;

このクエリは、DATE(order_date)product_id列をGROUP BY句で指定することで、日別商品ID別に注文数を集計します。

order_day | product_id | order_count
----------+------------+------------
2024-03-08 | 1          | 5
2024-03-08 | 2          | 3
2024-03-09 | 1          | 7
2024-03-09 | 2          | 8

集計関数

GROUP BY句と組み合わせて、さまざまな集計関数を使用することができます。

  • COUNT(*): データの数を集計
  • SUM(): 数値型の列の合計値を計算
  • AVG(): 数値



準備

CREATE TABLE orders (
  order_id INT,
  customer_id INT,
  order_date DATETIME,
  product_id INT,
  quantity INT,
  total_price DECIMAL(10,2)
);

INSERT INTO orders (order_id, customer_id, order_date, product_id, quantity, total_price)
VALUES
  (1, 100, '2023-03-08 10:00:00', 1, 1, 100),
  (2, 101, '2023-03-08 11:00:00', 2, 2, 200),
  (3, 102, '2023-03-09 12:00:00', 1, 3, 300),
  (4, 103, '2023-03-09 13:00:00', 2, 4, 400),
  (5, 100, '2023-03-10 14:00:00', 1, 5, 500),
  (6, 101, '2023-03-10 15:00:00', 2, 6, 600),
  (7, 102, '2024-03-08 16:00:00', 1, 7, 700),
  (8, 103, '2024-03-08 17:00:00', 2, 8, 800),
  (9, 100, '2024-03-09 18:00:00', 1, 9, 900),
  (10, 101, '2024-03-09 19:00:00', 2, 10, 1000);

日別集計

SELECT DATE(order_date) AS order_day, COUNT(*) AS order_count
FROM orders
GROUP BY DATE(order_date);

月別集計

SELECT MONTH(order_date) AS order_month, COUNT(*) AS order_count
FROM orders
GROUP BY MONTH(order_date);

年別集計

SELECT YEAR(order_date) AS order_year, COUNT(*) AS order_count
FROM orders
GROUP BY YEAR(order_date);

複数の列をグループ化

SELECT DATE(order_date) AS order_day, product_id, COUNT(*) AS order_count
FROM orders
GROUP BY DATE(order_date), product_id;

集計関数

-- 日別と商品ID別 の合計金額
SELECT DATE(order_date) AS order_day, product_id, SUM(total_price) AS total_revenue
FROM orders
GROUP BY DATE(order_date), product_id;

-- 日別 の 平均注文数
SELECT DATE(order_date) AS order_day, AVG(quantity) AS average_quantity
FROM orders
GROUP BY DATE(order_date);

MySQL日付グループ化して集計するには、GROUP BY句を使用します。DATE()MONTH()、**YEAR()**などの関数と組み合わせることで、日別、月別、年別など、さまざまな粒度でデータを分析することができます。

また、COUNT(*)SUM()AVG()などの集計関数と組み合わせて、データの件数、合計値、平均値などを計算することができます。




日付をグループ化して集計するその他の方法

CASE式

CASE式を使用して、日付を特定の条件に基づいてグループ化することができます。

SELECT
  CASE
    WHEN MONTH(order_date) BETWEEN 1 AND 3 THEN 'Q1'
    WHEN MONTH(order_date) BETWEEN 4 AND 6 THEN 'Q2'
    WHEN MONTH(order_date) BETWEEN 7 AND 9 THEN 'Q3'
    ELSE 'Q4'
  END AS quarter,
  COUNT(*) AS order_count
FROM orders
GROUP BY quarter;

このクエリは、CASE式を使用して、order_date列を四半期ごとにグループ化し、各四半期の注文数を集計します。

サブクエリを使用して、日付をグループ化してから集計することができます。

SELECT
  t.quarter,
  COUNT(*) AS order_count
FROM (
  SELECT
    CASE
      WHEN MONTH(order_date) BETWEEN 1 AND 3 THEN 'Q1'
      WHEN MONTH(order_date) BETWEEN 4 AND 6 THEN 'Q2'
      WHEN MONTH(order_date) BETWEEN 7 AND 9 THEN 'Q3'
      ELSE 'Q4'
    END AS quarter
  FROM orders
) AS t
GROUP BY t.quarter;

ウィンドウ関数

MySQL 8.0以降では、ウィンドウ関数を使用して、日付をグループ化してから集計することができます。

SELECT
  DATE(order_date) AS order_day,
  COUNT(*) OVER (PARTITION BY DATE(order_date)) AS order_count
FROM orders;

どの方法を使用するべきかは、要件と使用しているMySQLのバージョンによって異なります。

GROUP BY句は、最もシンプルで汎用性の高い方法です。

サブクエリは、より複雑なグループ化ロジックが必要な場合に役立ちます。

ウィンドウ関数は、MySQL 8.0以降を使用している場合は、より効率的な方法で日付をグループ化するのに役立ちます。

MySQLで日付をグループ化して集計するには、GROUP BY句、CASE式、サブクエリウィンドウ関数などの方法を使用することができます。


mysql sql date


開発コスト削減!SQLデータベースでジョブキューを構築してスケーラビリティと高可用性を手に入れよう

本記事では、SQLデータベースをジョブキュー(別名:バッチキュー、メッセージキュー)として利用する最適な方法について解説します。データベースは本来、データの永続的な保存を目的として設計されていますが、適切な設計と実装を行うことで、ジョブキューとしての機能も実現できます。...


エラー「すべての導出テーブルには独自のエイリアスが必要です」を解決する5つの方法

MySQLでサブクエリを使用する際に、「すべての導出テーブルには独自のエイリアスが必要です」というエラーが発生することがあります。これは、サブクエリがSELECT文の結果を別のテーブルのように扱うため、エイリアスが必要になるためです。原因このエラーが発生する理由は、サブクエリにエイリアスが指定されていないからです。サブクエリはSELECT文の結果を別のテーブルのように扱うため、他のテーブルと同様にエイリアスを指定する必要があります。...


データベースの整合性を保つ!MySQLで既存のテーブルに外部キーを追加する方法

既存のテーブルに外部キーを追加する ことは、データの整合性を維持し、データベーススキーマをより明確にするために重要です。MySQL で既存のテーブルに外部キーを追加するには、以下の手順に従います。外部キー制約を定義するまず、ALTER TABLE ステートメントを使用して、外部キー制約を定義する必要があります。...


【SQL Server】重複もOK!UNION ALLで結合したデータをORDER BYで美しく整列

SQL Server において、UNION ALL と ORDER BY を組み合わせることは、複数のクエリの結果を結合し、ソートされた状態で表示するために役立ちます。しかし、ORDER BY 句をどこに配置するかによって結果が大きく異なるため、注意が必要です。...


データベース接続のタイムアウトを理解しよう! SQL Server接続における「接続タイムアウト」

SQL Server 接続文字列における 接続タイムアウト は、クライアントアプリケーションが SQL Server インスタンスに接続を試行する際に、待機する最大時間を秒単位で設定する値です。この時間内に接続が確立されなければ、接続タイムアウトエラーが発生します。...


SQL SQL SQL SQL Amazon で見る



MySQLのGROUP BY句で売上データを月と年ごとに集計する方法

このチュートリアルでは、MySQLで月と年ごとにデータをグループ化する方法について説明します。 具体的には、GROUP BY句と集計関数を使用して、売上データの月ごとの売上合計、年間売上合計、各月の売上平均などを算出する方法を紹介します。必要条件