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()を使い分けることで、目的に応じた柔軟な集計が可能です。売上レポートやアクセス解析など、日付データを扱う場面でぜひ活用してみてください。
-
MySQLで現在の日付とテーブル内の日付レコードの差を求める方法
現在の日付とテーブルに保存された日付レコードの差(日数)を求めるには、MySQLの DATEDIFF() 関数を使用します。この関数は、2つの日付の差を日数で返してくれる便利な関数です。ここでは、実際にテーブルを作成し、データを挿入して、現在の日付との差を計算する手順を順番に見ていきましょう。1. テーブルの作成まず、日付型のカラムを持つテーブルを作成します。mysql> create table DemoTable1446-> (-> DueDate date-> );Query OK, 0 rows affected (1.42 sec)2. レコードの挿入次に、I
-
MySQLで月ごとにテーブルの合計値を集計する方法
MySQLで日付データを月単位にグループ化して合計値を求めたい場合、GROUP BY句とMONTH()関数を組み合わせることで簡単に実現できます。この記事では、実際のサンプルを使いながら手順を詳しく解説します。1. サンプルテーブルの作成まず、購入日と金額を格納するテーブルを作成します。mysql> create table DemoTable1628 -> ( -> PurchaseDate date, -> Amount int -> ); Query OK, 0 rows affected (1.55 sec)2. テストデー