MySQLで同じ日付のレコードの値を合計する方法(GROUP BYとDATE関数の使い方)
はじめに
MySQLでは、GROUP BY句とDATE()関数を組み合わせることで、同じ日付(日単位)のレコードに含まれる値を簡単に合計できます。datetime型のカラムには時刻情報も含まれていますが、DATE()関数を使えば日付部分だけを取り出してグループ化できるのがポイントです。
ここでは、実際にサンプルテーブルを作成し、同じ日の値を合計する手順を順番に解説していきます。
1. テーブルを作成する
まず、以下のコマンドでテーブルを作成しましょう。今回は購入日時(PurchaseDate)と商品価格(ProductPrice)を持つテーブルを用意しました。
mysql> create table DemoTable1358
-> (
-> PurchaseDate datetime,
-> ProductPrice int
-> );
Query OK, 0 rows affected (1.59 sec)
2. レコードを挿入する
次に、insertコマンドを使ってテーブルにデータを登録します。あえて同じ日付(2019-09-21など)を持つ複数のレコードを含めています。
mysql> insert into DemoTable1358 values('2019-09-20 12:34:00', 450);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1358 values('2019-09-21 11:00:00', 1050);
Query OK, 1 row affected (0.27 sec)
mysql> insert into DemoTable1358 values('2018-09-21 02:10:00', 2050);
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable1358 values('2019-09-21 05:20:40', 5050);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable1358 values('2016-09-21 04:10:56', 1000);
Query OK, 1 row affected (0.18 sec)
3. 登録したレコードを確認する
select文で全レコードを表示してみましょう。
mysql> select * from DemoTable1358;
実行すると、以下のような結果が得られます。
+---------------------+--------------+ | PurchaseDate | ProductPrice | +---------------------+--------------+ | 2019-09-20 12:34:00 | 450 | | 2019-09-21 11:00:00 | 1050 | | 2018-09-21 02:10:00 | 2050 | | 2019-09-21 05:20:40 | 5050 | | 2016-09-21 04:10:56 | 1000 | +---------------------+--------------+ 5 rows in set (0.00 sec)
4. 同じ日の合計値を求めるクエリ
いよいよ本題です。DATE()関数で取り出した日付ごとにSUM()でProductPriceを集計することで、同一日の値の合計を取得できます。
mysql> select PurchaseDate,sum(ProductPrice) from DemoTable1358
-> group by date(PurchaseDate);
実行結果は次の通りです。
+---------------------+-------------------+ | PurchaseDate | sum(ProductPrice) | +---------------------+-------------------+ | 2019-09-20 12:34:00 | 450 | | 2019-09-21 11:00:00 | 6100 | | 2018-09-21 02:10:00 | 2050 | | 2016-09-21 04:10:56 | 1000 | +---------------------+-------------------+ 4 rows in set (0.00 sec)
結果の見方
注目すべきは「2019-09-21」の行です。この日は時刻の異なる2件のレコード(1050と5050)が存在しますが、それらが正しく合計され「6100」と表示されています。元のテーブルは5件でしたが、日付でグループ化したことで4行にまとまっている点にも注目してください。
このように、datetime型のカラムでもGROUP BY date(カラム名)と書けば、日単位での集計が可能になります。
補足:表示を見やすくする工夫
SELECT句でPurchaseDateをそのまま指定すると、各グループから任意の時刻を含む値が1件だけ返されます。より厳密で分かりやすい表示にしたい場合は、SELECT句にもdate()関数を記述し、別名を付ける方法がおすすめです。
mysql> select date(PurchaseDate) as PurchaseDay,
-> sum(ProductPrice) as TotalPrice
-> from DemoTable1358
-> group by date(PurchaseDate);
これで、日付ごとの合計値をきれいな形式で一覧できます。売上データやログデータの日次集計など、実務でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。
-
【MySQL】GROUP BYとMAX()を使って同名の学生レコードから最大年齢を取得する方法
はじめに MySQLで、同じ名前の学生が複数登録されているテーブルから、名前ごとの最大年齢を取得したいケースはよくあります。このような場合には、GROUP BY句と集計関数のMAX()を組み合わせることで、シンプルかつ効率的に実現できます。 本記事では、実際にテーブルを作成し、サンプルデータを挿入しながら、学生名ごとに最大年齢を取得する手順を詳しく解説します。 テーブルの作成 まず、サンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1964 ( StudentName varchar(20), StudentAge int
-
「UP」という同じ名前の列を持つ5つのテーブルの合計を計算するMySQLクエリ
解決方法の概要 「UP」という同じ名前の列を持つ複数のテーブルから合計値を計算するには、UNION ALLとSUM()関数を組み合わせて使用します。各テーブルごとにSUM()で合計を求め、UNION ALLでその結果を縦に連結し、最後に外側のSUM()によって全体の合計値を取得します。 サンプルテーブルの作成 まず、動作確認用に5つのテーブルを作成します。1つ目のテーブルは以下のように作成し、データを挿入します。 mysql> create table DemoTable1977 ( UP int ); Query OK, 0 rows affected (0.0