MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで月ごとにレコードを集計・フィルタリングする方法|SUMとGROUP BYの活用

MySQLで月ごとにレコードを抽出・集計したい場合、集計関数SUM()GROUP BY句を組み合わせることで簡単に実現できます。本記事では、購入日(PurchaseDate)を基準に月別の合計値を求める方法を、実際のSQLサンプルとともにわかりやすく解説します。

サンプルテーブルを作成する

まず、デモ用のテーブルを作成します。テーブル作成のクエリは以下の通りです。

mysql> create table SelectPerMonthDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> Price int,
    -> PurchaseDate datetime
    -> );
Query OK, 0 rows affected (2.34 sec)

このテーブルは、主キーとなる「Id」、価格を表す「Price」、購入日時を表す「PurchaseDate」の3つのカラムで構成されています。

テストデータを挿入する

続いて、INSERT文でサンプルレコードを追加します。date_add()関数を使えば、現在日時から1か月前や数か月後といった相対的な日付を簡単に生成できます。

mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(600,date_add(now(),
interval -1 month));
Query OK, 1 row affected (0.42 sec)
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(600,date_add(now(),
interval 2 month));
Query OK, 1 row affected (0.34 sec)
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(400,now());
Query OK, 1 row affected (0.20 sec)
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(800,date_add(now(),
interval 3 month));
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(900,date_add(now(),
interval 4 month));
Query OK, 1 row affected (0.10 sec)
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(100,date_add(now(),
interval 4 month));
Query OK, 1 row affected (0.22 sec)
mysql> insert into SelectPerMonthDemo(Price,PurchaseDate) values(1200,date_add(now(),
interval -1 month));
Query OK, 1 row affected (0.09 sec)

登録されたレコードを確認する

SELECT文ですべてのレコードを表示してみましょう。

mysql> select *from SelectPerMonthDemo;

以下が実行結果です。各商品の価格と購入日時が確認できます。

+----+-------+---------------------+
| Id | Price | PurchaseDate        |
+----+-------+---------------------+
|  1 |   600 | 2019-01-10 22:39:30 |
|  2 |   600 | 2019-04-10 22:39:47 |
|  3 |   400 | 2019-02-10 22:40:03 |
|  4 |   800 | 2019-05-10 22:40:18 |
|  5 |   900 | 2019-06-10 22:40:29 |
|  6 |   100 | 2019-06-10 22:40:41 |
|  7 |  1200 | 2019-01-10 22:40:50 |
+----+-------+---------------------+
7 rows in set (0.00 sec)

月名ごとにレコードを集計する

購入日を基準に、月ごとの価格合計を取得するクエリがこちらです。monthname()関数で月名を取り出し、それをGROUP BY句でグルーピングしています。

mysql> select monthname(PurchaseDate) as MONTHNAME,sum(Price) from
SelectPerMonthDemo
-> group by monthname(PurchaseDate);

実行結果は以下の通りです。1月の合計が1800、6月の合計が1000など、月別の集計値が一覧で表示されます。

+-----------+------------+
| MONTHNAME | sum(Price) |
+-----------+------------+
| January   |       1800 |
| April     |        600 |
| February  |        400 |
| May       |        800 |
| June      |       1000 |
+-----------+------------+
5 rows in set (0.07 sec)

月番号で集計結果を表示する

月名ではなく月の数字(1〜12)で結果を取得したい場合は、month()関数を使用します。

mysql> select month(PurchaseDate),sum(Price) from SelectPerMonthDemo
-> group by month(PurchaseDate);

実行結果:

+---------------------+------------+
| month(PurchaseDate) | sum(Price) |
+---------------------+------------+
|                   1 |       1800 |
|                   4 |        600 |
|                   2 |        400 |
|                   5 |        800 |
|                   6 |       1000 |
+---------------------+------------+
5 rows in set (0.00 sec)

まとめ

MySQLで月別にレコードを集計するには、SUM()GROUP BYの組み合わせが基本となります。月名で表示したい場合はmonthname()、月番号で表示したい場合はmonth()を使い分けることで、目的に応じた柔軟な集計が可能です。売上レポートやアクセス解析など、日付データを扱う場面でぜひ活用してみてください。

  1. MySQLで現在の日付とテーブル内の日付レコードの差を求める方法

    現在の日付とテーブルに保存された日付レコードの差(日数)を求めるには、MySQLの DATEDIFF() 関数を使用します。この関数は、2つの日付の差を日数で返してくれる便利な関数です。ここでは、実際にテーブルを作成し、データを挿入して、現在の日付との差を計算する手順を順番に見ていきましょう。1. テーブルの作成まず、日付型のカラムを持つテーブルを作成します。mysql> create table DemoTable1446-> (-> DueDate date-> );Query OK, 0 rows affected (1.42 sec)2. レコードの挿入次に、I

  2. MySQLで月ごとにテーブルの合計値を集計する方法

    MySQLで日付データを月単位にグループ化して合計値を求めたい場合、GROUP BY句とMONTH()関数を組み合わせることで簡単に実現できます。この記事では、実際のサンプルを使いながら手順を詳しく解説します。1. サンプルテーブルの作成まず、購入日と金額を格納するテーブルを作成します。mysql> create table DemoTable1628 -> ( -> PurchaseDate date, -> Amount int -> ); Query OK, 0 rows affected (1.55 sec)2. テストデー