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

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);

これで、日付ごとの合計値をきれいな形式で一覧できます。売上データやログデータの日次集計など、実務でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。

  1. 【MySQL】GROUP BYとMAX()を使って同名の学生レコードから最大年齢を取得する方法

    はじめに MySQLで、同じ名前の学生が複数登録されているテーブルから、名前ごとの最大年齢を取得したいケースはよくあります。このような場合には、GROUP BY句と集計関数のMAX()を組み合わせることで、シンプルかつ効率的に実現できます。 本記事では、実際にテーブルを作成し、サンプルデータを挿入しながら、学生名ごとに最大年齢を取得する手順を詳しく解説します。 テーブルの作成 まず、サンプル用のテーブルを作成しましょう。 mysql> create table DemoTable1964 ( StudentName varchar(20), StudentAge int

  2. 「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