MySQLで日付別にデータをグループ化してカウントする方法
MySQLでは、GROUP BY句とCOUNT()関数を組み合わせることで、日付別にデータをグループ化し、それぞれの件数を簡単に集計することができます。本記事では、実際のテーブルを作成しながら、その具体的な手順を解説します。
基本構文
日付別(およびその他の列)でグループ化してカウントする場合、基本的なSQL構文は以下のようになります。
SELECT yourColumnName1, yourColumnName2, ..N, COUNT(*) AS anyAliasName FROM yourTableName GROUP BY yourColumnName1, yourColumnName2;
COUNT(*)には任意の別名(エイリアス)を付けることで、結果セットの見出しがわかりやすくなります。
サンプルテーブルの作成
まずは動作を確認するためのテーブルを作成しましょう。以下のクエリで「GroupAndCountByDate」というテーブルを定義します。
mysql> create table GroupAndCountByDate
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> TripDate date,
-> ShopId int,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.79 sec)
このテーブルは、自動採番される「Id」を主キーとし、「TripDate」(日付型)と「ShopId」(店舗ID)を持つシンプルな構造です。
テストデータの挿入
次に、INSERTコマンドを使っていくつかのレコードを挿入します。
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-01-31',10);
Query OK, 1 row affected (0.52 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-02-01',15);
Query OK, 1 row affected (0.17 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-01-31',10);
Query OK, 1 row affected (0.23 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-02-01',15);
Query OK, 1 row affected (0.31 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-03-23',20);
Query OK, 1 row affected (0.15 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-04-21',25);
Query OK, 1 row affected (0.20 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-03-13',20);
Query OK, 1 row affected (0.16 sec)
mysql> insert into GroupAndCountByDate(TripDate,ShopId) values('2019-04-06',25);
Query OK, 1 row affected (0.17 sec)
同じ「TripDate」と「ShopId」の組み合わせが複数存在するデータも含めている点に注目してください。
登録済みレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from GroupAndCountByDate;
実行結果は以下の通りです。
+----+------------+--------+ | Id | TripDate | ShopId | +----+------------+--------+ | 1 | 2019-01-31 | 10 | | 2 | 2019-02-01 | 15 | | 3 | 2019-01-31 | 10 | | 4 | 2019-02-01 | 15 | | 5 | 2019-03-23 | 20 | | 6 | 2019-04-21 | 25 | | 7 | 2019-03-13 | 20 | | 8 | 2019-04-06 | 25 | +----+------------+--------+ 8 rows in set (0.00 sec)
合計8件のレコードが登録されていることが確認できました。
日付別にグループ化してカウントするクエリ
いよいよ本題です。「TripDate」と「ShopId」でグループ化し、各グループの件数を「TOTALTRIP」という別名で表示するクエリは以下のようになります。
mysql> select TripDate,ShopId,COUNT(*) as TOTALTRIP
-> from GroupAndCountByDate
-> group by TripDate,ShopId;
実行結果:
+------------+--------+-----------+ | TripDate | ShopId | TOTALTRIP | +------------+--------+-----------+ | 2019-01-31 | 10 | 2 | | 2019-02-01 | 15 | 2 | | 2019-03-23 | 20 | 1 | | 2019-04-21 | 25 | 1 | | 2019-03-13 | 20 | 1 | | 2019-04-06 | 25 | 1 | +------------+--------+-----------+ 6 rows in set (0.00 sec)
結果の読み方
この出力から、以下のことがわかります。
- 2019年1月31日の店舗ID 10:2回(重複データが1組)
- 2019年2月1日の店舗ID 15:2回(重複データが1組)
- その他の日付・店舗の組み合わせ:それぞれ1回ずつ
元の8件のレコードが、6つのグループに集約されました。このようにGROUP BY句で指定した列の組み合わせごとにCOUNT(*)が件数を返すため、日別・店舗別の出現回数などを簡単に集計できます。
まとめ
MySQLで日付別にデータをグループ化してカウントするには、GROUP BY句に集計したい列(ここでは日付列や店舗IDなど)を指定し、COUNT(*)関数で件数を取得します。売上分析やアクセスログの集計など、実務でも頻繁に使われるテクニックなので、ぜひマスターしておきましょう。
-
MySQLの単一クエリでGROUP BYとCOUNTを使い、重複レコードをグループ化して最大値を表示する方法
MySQLでは、GROUP BY句とCOUNT()関数を組み合わせることで、重複する値を持つレコードを効率的にグループ化できます。さらにMAX()関数を併用すれば、各グループ内の最大値も同時に取得可能です。本記事では、具体的な手順を実行例とともに解説します。テーブルの作成まず、サンプルとなるテーブルを作成しましょう。mysql> create table DemoTable -> ( -> ClientId int, -> Value
-
COUNT関数とGROUP BY句を使ったSQLクエリの書き方(DB2実行例付き)
課題DB2のTRANSACTIONSテーブルに対して、特定のトランザクションID(TRANSACTION_ID)に割り当てられた注文数(ORDER_ID)を一覧表示するSQLクエリを作成します。解決方法この課題は、COUNT関数とGROUP BY句を組み合わせることで簡単に解決できます。COUNT関数で注文IDの件数を集計し、GROUP BY句でトランザクションIDごとに行をグループ化することで、各トランザクションに紐づく注文の総数を取得できます。SQLクエリの例SELECT TRANSACTION_ID, COUNT(ORDER_ID) FROM TRANSACTIONS &nb