MySQLのGROUP BY句で日付をグループ化してレコードを表示する方法
MySQLで日付をグループ化する基本
MySQLで日付データをグループ化してレコードを表示するには、GROUP BY句を使用します。この記事では、顧客ごとに出荷日の最小値と最大値を取得する例を通じて、GROUP BY句の使い方を詳しく解説します。
1. サンプルテーブルの作成
まず、顧客名と出荷日を格納するテーブルを作成します。
mysql> create table DemoTable2002
(
CustomerName varchar(20),
CustomerShippingDate datetime
);
Query OK, 0 rows affected (0.61 sec)
2. レコードの挿入
INSERT文を使って、サンプルデータをテーブルに追加します。
mysql> insert into DemoTable2002 values('Chris','2019-01-10');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable2002 values('David','2018-12-31');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2002 values('David','2019-12-16');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable2002 values('Chris','2018-12-01');
Query OK, 1 row affected (0.12 sec)
3. テーブル内の全レコードを確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select * from DemoTable2002;
実行結果は以下の通りです。
+--------------+----------------------+ | CustomerName | CustomerShippingDate | +--------------+----------------------+ | Chris | 2019-01-10 00:00:00 | | David | 2018-12-31 00:00:00 | | David | 2019-12-16 00:00:00 | | Chris | 2018-12-01 00:00:00 | +--------------+----------------------+ 4 rows in set (0.00 sec)
4. 日付をグループ化してレコードを表示するクエリ
ここが本題です。顧客名(CustomerName)でグループ化し、それぞれの顧客の最も古い出荷日と最新の出荷日を取得するには、以下のようにMIN関数とMAX関数をGROUP BY句と組み合わせて使用します。
mysql> select date(min(CustomerShippingDate)),date(max(CustomerShippingDate)),CustomerName
from DemoTable2002
group by CustomerName;
実行結果は以下の通りです。
+---------------------------------+---------------------------------+--------------+ | date(min(CustomerShippingDate)) | date(max(CustomerShippingDate)) | CustomerName | +---------------------------------+---------------------------------+--------------+ | 2018-12-01 | 2019-01-10 | Chris | | 2018-12-31 | 2019-12-16 | David | +---------------------------------+---------------------------------+--------------+ 2 rows in set (0.00 sec)
解説:クエリのポイント
- MIN() / MAX()関数: グループ内の最小値・最大値を取得します。datetime型の場合でも正しく動作します。
- DATE()関数: datetime型から時刻部分を取り除き、日付のみを表示するために使用しています。これにより「2018-12-01 00:00:00」ではなく「2018-12-01」という見やすい形式になります。
- GROUP BY句: CustomerNameを指定することで、同じ顧客名のレコードが1つのグループにまとめられます。
このようにGROUP BY句を使えば、顧客ごとの最初の出荷日と最後の出荷日を簡単に集計できます。売上分析や配送履歴の管理など、実務でも頻繁に使われるテクニックなので、ぜひマスターしておきましょう。
-
MySQLのストアドプロシージャでテーブルのレコードを表示する方法
MySQLでは、ストアドプロシージャ内にSELECT文を組み込むことで、テーブルのレコードを簡単に表示できます。ストアドプロシージャを活用すると、よく使うクエリを再利用可能な形で保存できるため、作業の効率化につながります。ここでは、実際の手順を順番に解説していきます。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable1933 ( ClientName varchar(20) ); Query OK, 0 rows affected (0.00 sec)2. レコードを挿入する次に、INSERT
-
MySQLでTRUE/FALSEのレコードを0/1として表示する方法
MySQLでTRUE/FALSEのレコードを0/1として表示する方法MySQLでは、カラムのデータ型をBOOLEANとして定義することで、TRUE/FALSEの値が自動的に0と1として表示されます。BOOLEAN型は内部的にはTINYINT(1)のエイリアスであり、TRUEは1、FALSEは0として扱われます。以下、具体的な手順を解説します。1. テーブルの作成まず、BOOLEAN型のカラムを含むテーブルを作成しましょう。mysql> create table DemoTable2035 -> (