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

【MySQL】DATE_FORMAT()で日付から月の列を作成し、重複する月の金額を合計して表示する方法

はじめに

日付データから月ごとの列を作成し、同じ月(重複する日付)が存在する場合には対応する数値列の合計を表示したいケースはよくあります。MySQLではDATE_FORMAT()関数とGROUP BY句を組み合わせることで、このような月別集計を簡単に実現できます。本記事では、具体的な手順をサンプルコード付きで解説します。

テーブルの作成

まず、サンプル用のテーブルを作成しましょう。

mysql> create table DemoTable
-> (
-> PurchaseDate date,
-> Amount int
-> );
Query OK, 0 rows affected (0.52 sec)

ここでは、購入日を格納する「PurchaseDate」(date型)と金額を格納する「Amount」(int型)の2つのカラムを持つテーブルを定義しています。

レコードの挿入

次に、INSERTコマンドを使ってテーブルにいくつかのレコードを追加します。

mysql> insert into DemoTable values('2019-10-12',500);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('2018-10-12',1000);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values('2019-01-10',600);
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('2018-10-12',600);
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable values('2018-11-10',800);
Query OK, 1 row affected (0.18 sec)

登録データの確認

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

mysql> select *from DemoTable;

実行結果は以下の通りです。

+--------------+--------+
| PurchaseDate | Amount |
+--------------+--------+
| 2019-10-12 | 500 |
| 2018-10-12 | 1000 |
| 2019-01-10 | 600 |
| 2018-10-12 | 600 |
| 2018-11-10 | 800 |
+--------------+--------+
5 rows in set (0.00 sec)

「2018-10-12」のように同じ月の日付が複数存在することが確認できます。

月別に合計を集計するクエリ

それでは本題です。日付から月の列を作成し、重複する月が見つかった場合に対応するAmount列の合計を表示するクエリは以下の通りです。

mysql> select sum(Amount) as Amount,date_format(PurchaseDate,'%b') AS Month from DemoTable
-> group by date_format(PurchaseDate,'%Y-%m');

実行結果:

+--------+-------+
| Amount | Month |
+--------+-------+
| 500 | Oct |
| 1600 | Oct |
| 600 | Jan |
| 800 | Nov |
+--------+-------+
4 rows in set (0.00 sec)

クエリのポイント解説

出力結果を見ると、2018年10月の2件(1000 + 600 = 1600)が1行にまとめられていることがわかります。この動作の鍵となるのが以下の2点です。

  • GROUP BY date_format(PurchaseDate,'%Y-%m'):「%Y-%m」(年と月)を指定してグループ化しているため、異なる年の同じ月(例:2018年10月と2019年10月)は別々に集計されます。
  • date_format(PurchaseDate,'%b'):表示用のMonth列には「%b」(月の省略名)を指定しているため、「Oct」「Jan」「Nov」のような月名だけが出力されます。

このようにDATE_FORMAT()の書式指定子とGROUP BYを組み合わせれば、月単位・年単位など柔軟な期間での売上集計やレポート作成に応用できます。

  1. MySQLで重複する列の値を検索して表示する方法(GROUP BY HAVING句の使い方)

    MySQLでテーブル内の重複データを検索したい場面は多くあります。例えば、登録データの重複チェックやデータクレンジングなどが挙げられます。このような場合には、GROUP BY句とHAVING句を組み合わせることで、簡単に重複する列の値を抽出できます。 重複検出の基本的な考え方 GROUP BY句で列の値ごとにレコードをグループ化し、HAVING句で「同じ値が2件以上存在するグループ」だけを絞り込むことで、重複している値だけを取り出すことができます。 サンプルテーブルの作成 まず、検証用のテーブルを作成します。 mysql> create table DemoTable1858  

  2. 複数行の文字列を1行に結合し、対応するIDの合計も表示するMySQLクエリの書き方

    GROUP_CONCAT()とSUM()を組み合わせた集計方法複数行に分かれた文字列を1つの行にまとめて結合し、さらにIDの合計値を別の列として同時に表示したい場合は、GROUP_CONCAT()関数とSUM()関数を組み合わせることで実現できます。ここでは、実際にテーブルを作成し、動作を確認する手順を見ていきましょう。1. サンプルテーブルの作成まず、学生IDと学生名を持つテーブルを作成します。mysql> create table DemoTable1960 ( StudentId int, StudentName varchar(20) ); Que