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

2024-06-26

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

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

必要条件

このチュートリアルを理解するには、以下の知識が必要です。

  • MySQLの基本的な知識
  • SELECT句、WHERE句などの基本的なSQLクエリ
  • GROUP BY句と集計関数の基本的な使用方法

準備

まず、練習用のデータベースとテーブルを作成する必要があります。 ここでは、salesという名前のテーブルを作成し、以下の列を持つと仮定します。

  • order_id: 注文ID (主キー)
  • order_date: 注文日
  • customer_id: 顧客ID
  • product_id: 商品ID
  • quantity: 注文個数
  • unit_price: 単価
  • total_price: 合計金額

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

月ごとの売上合計を算出する

以下のクエリは、salesテーブルのデータを月ごとにグループ化し、各月の売上合計を算出します。

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

このクエリは、以下の結果を返します。

売上合計
2023112345.67
2023223456.78
2023334567.89
.........
SELECT
  YEAR(order_date) AS year,
  SUM(total_price) AS total_sales
FROM sales
GROUP BY YEAR(order_date)
ORDER BY year;
売上合計
2023123456.78
202298765.43
202176543.21
......
SELECT
  YEAR(order_date) AS year,
  MONTH(order_date) AS month,
  AVG(total_price) AS average_sales
FROM sales
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY year, month;
売上平均
202311029.14
202321958.39
202332883.65
.........

その他の集計関数

上記の例では、SUM関数を使用して売上合計を算出しましたが、他の集計関数も使用できます。 例えば、以下のようにCOUNT関数を使用して注文数を、MIN関数を使用して最小売上金額、MAX関数を使用して最大売上金額などを算出することができます。

-- 注文数
SELECT
  YEAR(order_date) AS year,
  MONTH(order_date) AS month,
  COUNT(*) AS order_count
FROM sales
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY year, month;

-- 最小売上金額
SELECT
  YEAR(order_date) AS year,
  MONTH(order_date) AS month,
  MIN(total_price) AS min_sales
FROM sales
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER



必要なテーブル

CREATE TABLE sales (
  order_id INT PRIMARY KEY AUTO_INCREMENT,
  order_date DATE NOT NULL,
  customer_id INT NOT NULL,
  product_id INT NOT NULL,
  quantity INT NOT NULL,
  unit_price DECIMAL(10,2) NOT NULL,
  total_price DECIMAL(10,2) NOT NULL,
  CONSTRAINT fk_customer (customer_id) REFERENCES customers(customer_id),
  CONSTRAINT fk_product (product_id) REFERENCES products(product_id)
);

以下のサンプルデータを使用して、クエリを実行してみましょう。

INSERT INTO sales (order_date, customer_id, product_id, quantity, unit_price, total_price)
VALUES
  ('2023-01-01', 1, 1, 2, 10.00, 20.00),
  ('2023-01-02', 2, 2, 3, 5.00, 15.00),
  ('2023-01-03', 1, 3, 1, 20.00, 20.00),
  ('2023-01-10', 3, 1, 4, 10.00, 40.00),
  ('2023-02-05', 1, 2, 2, 5.00, 10.00),
  ('2023-02-15', 2, 3, 1, 20.00, 20.00),
  ('2023-02-20', 3, 1, 3, 10.00, 30.00);

クエリ

SELECT
  YEAR(order_date) AS year,
  MONTH(order_date) AS month,
  SUM(total_price) AS total_sales,
  COUNT(*) AS order_count,
  AVG(total_price) AS average_sales
FROM sales
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY year, month;
売上合計注文数売上平均
2023170.00417.50
2023260.00320.00

このコードは、GROUP BY句と集計関数を使用して、月ごとの売上データを集計する方法を示しています。 このコードを参考に、自分のニーズに合わせてクエリをカスタマイズすることができます。

説明

  • YEAR(order_date): この式は、注文日の年から年を抽出します。
  • SUM(total_price): この式は、各月の売上合計を算出します。
  • COUNT(*): この式は、各月の注文数を算出します。
  • GROUP BY YEAR(order_date), MONTH(order_date): この句は、データを年と月ごとにグループ化します。
  • ORDER BY year, month: この句は、結果を年と月の昇順で並べ替えます。

このサンプルコードは、MySQLで月と年ごとにデータをグループ化する方法を理解するのに役立つ出発点となるでしょう。




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

DATE_FORMAT関数を使用して、注文日を「YYYY-MM」形式の文字列に変換してから、GROUP BY句でグループ化することができます。

SELECT
  SUBSTRING(DATE_FORMAT(order_date, '%Y-%m'), 1, 5) AS year_month,
  SUM(total_price) AS total_sales
FROM sales
GROUP BY SUBSTRING(DATE_FORMAT(order_date, '%Y-%m'), 1, 5)
ORDER BY year_month;
年月売上合計
2023-0170.00
2023-0260.00

集計関数の別名を使用する

集計関数に別名を付けることで、クエリ結果の見やすさを向上させることができます。

SELECT
  YEAR(order_date) AS year,
  MONTH(order_date) AS month,
  SUM(total_price) AS total_sales,
  COUNT(*) AS order_count,
  AVG(total_price) AS average_price
FROM sales
GROUP BY YEAR(order_date), MONTH(order_date)
ORDER BY year, month;
売上合計注文数売上平均
2023170.00417.50
2023260.00320.00
SELECT
  CASE
    WHEN MONTH(order_date) = 1 THEN '1月'
    WHEN MONTH(order_date) = 2 THEN '2月'
    ...
    ELSE MONTH(order_date)
  END AS month_name,
  SUM(total_price) AS total_sales
FROM sales
GROUP BY CASE
    WHEN MONTH(order_date) = 1 THEN '1月'
    WHEN MONTH(order_date) = 2 THEN '2月'
    ...
    ELSE MONTH(order_date)
  END
ORDER BY month_name;
月名売上合計
1月70.00
2月60.00

サブクエリを使用して、月ごとの売上合計を算出する列を作成してから、GROUP BY句でグループ化することができます。

SELECT
  year,
  month,
  total_sales
FROM (
  SELECT
    YEAR(order_date) AS year,
    MONTH(order_date) AS month,
    SUM(total_price) AS total_sales
  FROM sales
  GROUP BY YEAR(order_date), MONTH(order_date)
) AS subquery
ORDER BY year, month;
売上合計
2023170.00
2023260.00

MySQLで月と年ごとにデータをグループ化するには、さまざまな方法があります。 上記の方法はほんの一例であり、ニーズに合わせて最適な方法を選択することができます。

補足

  • ここでは、基本的なクエリのみを紹介しています。 より複雑な分析を行う場合は、WHERE句やHAVING句などの他の句を組み合わせて使用することができます。
  • 性能を向上させるために、適切なインデックスを作成することを検討してください。

sql mysql group-by


C#/VB.NET プログラマー必見!T-SQL CAST デコードのすべて

T-SQL CAST は、データを異なるデータ型に変換する関数です。C#/VB. NET で T-SQL CAST を使用する場合、デコードが必要になることがあります。この解説では、T-SQL CAST のデコード方法について、C#/VB...


SQLとMS-Accessで別のテーブルから抽出されたレコードをテーブルに挿入する方法

このチュートリアルでは、SQLとMS-Accessを使って、別のテーブルから抽出されたレコードを別のテーブルに挿入する方法を解説します。前提条件SQLとMS-Accessの基本的な知識テーブルとレコードの概念手順INSERT INTO ステートメント...


【決定版】PHPとMySQLで発生する「Lost connection to MySQL server at 'reading initial communication packet', system error: 0」エラーの解決策

このエラーの原因はいくつか考えられます。MySQLサーバーが起動していない: 最も一般的な原因は、MySQLサーバーが起動していないことです。サーバーが起動していることを確認してください。ネットワークの問題: MySQLサーバーとPHPアプリケーション間でネットワーク接続の問題が発生している可能性があります。ファイアウォール設定やネットワーク設定を確認してください。...


SQLにおけるデータ分析をマスターするための必須スキル:2つのSELECTステートメント結果の結合

SQLにおいて、複数のSELECTステートメントの結果を結合することは、様々なデータ分析やレポート作成において重要です。結合には、主に以下の3種類があります。INNER JOIN: 一致する行のみを結合します。最も一般的な結合方法です。LEFT JOIN: 左側のテーブルのすべての行と、右側のテーブルで一致する行を結合します。右側テーブルで一致しない行は、NULL値として扱われます。...