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

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(*)関数で件数を取得します。売上分析やアクセスログの集計など、実務でも頻繁に使われるテクニックなので、ぜひマスターしておきましょう。

  1. MySQLの単一クエリでGROUP BYとCOUNTを使い、重複レコードをグループ化して最大値を表示する方法

    MySQLでは、GROUP BY句とCOUNT()関数を組み合わせることで、重複する値を持つレコードを効率的にグループ化できます。さらにMAX()関数を併用すれば、各グループ内の最大値も同時に取得可能です。本記事では、具体的な手順を実行例とともに解説します。テーブルの作成まず、サンプルとなるテーブルを作成しましょう。mysql> create table DemoTable    -> (    -> ClientId int,    -> Value

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