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

MySQLで日付を条件に価格の最小値・最大値を取得する方法(CASE文の活用)

日付を条件として、テーブル内の価格データから最小値と最大値を取得したい場合には、CASE文を使用します。CASE文で現在の日付が開始日〜終了日の範囲内かどうかを判定し、その結果を集計関数である MIN() および MAX() で包むことで実現できます。

基本構文

まずは全体の構文を見てみましょう。

SELECT
MIN(CASE WHEN CURDATE() BETWEEN yourStartDateColumnName AND yourEndDateColumnName THEN yourLowPriceColumnName ELSE yourHighPriceColumnName END) AS anyVariableName,

MAX(CASE WHEN CURDATE() BETWEEN yourStartDateColumnName AND yourEndDateColumnName THEN yourLowPriceColumnName ELSE yourHighPriceColumnName END) AS anyVariableName
FROM yourTableName;

この構文では、CURDATE()(現在の日付)が BETWEEN によって開始日と終了日の範囲内であれば「低価格」カラムの値を返し、範囲外であれば「高価格」カラムの値を返します。その結果をそれぞれ MIN()MAX() で集計することで、条件に応じた最小値・最大値を一度に取得できます。

サンプルテーブルの作成

実際の動作を確認するために、テーブルを作成してみましょう。テーブル作成用のクエリは以下の通りです。

mysql> create table ConditionalSelect
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> StartDate datetime,
    -> EndDate datetime,
    -> LowerPrice int,
    -> HigherPrice int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.69 sec)

レコードの挿入

次に、INSERTコマンドを使ってサンプルデータを数件挿入します。

mysql> insert into ConditionalSelect(StartDate,EndDate,LowerPrice,HigherPrice) values('2019-01-02','2019-04-02',5,10);
Query OK, 1 row affected (0.12 sec)
mysql> insert into ConditionalSelect(StartDate,EndDate,LowerPrice,HigherPrice) values('2019-04-02','2019-04-20',0,20);
Query OK, 1 row affected (0.17 sec)
mysql> insert into ConditionalSelect(StartDate,EndDate,LowerPrice,HigherPrice) values('2019-04-03','2019-04-21',0,30);
Query OK, 1 row affected (0.17 sec)

登録データの確認

SELECT文ですべてのレコードを表示して内容を確認しておきます。

mysql> select *from ConditionalSelect;

以下が出力結果です。

+----+---------------------+---------------------+------------+-------------+
| Id | StartDate           | EndDate             | LowerPrice | HigherPrice |
+----+---------------------+---------------------+------------+-------------+
|  1 | 2019-01-02 00:00:00 | 2019-04-02 00:00:00 |          5 |          10 |
|  2 | 2019-04-02 00:00:00 | 2019-04-20 00:00:00 |          0 |          20 |
|  3 | 2019-04-03 00:00:00 | 2019-04-21 00:00:00 |          0 |          30 |
+----+---------------------+---------------------+------------+-------------+
3 rows in set (0.00 sec)

日付条件付きで最小値・最大値を取得するクエリ

それでは本題です。日付を条件として価格の最小値と最大値を選択するクエリは次のようになります。

mysql> SELECT
   -> MIN(CASE WHEN CURDATE() BETWEEN StartDate AND EndDate THEN LowerPrice ELSE HigherPrice END) AS MinimumValue,
   -> MAX(CASE WHEN CURDATE() BETWEEN StartDate AND EndDate THEN LowerPrice ELSE HigherPrice END) AS MaximumValue
   -> from ConditionalSelect;

以下が実行結果です。

+--------------+--------------+
| MinimumValue | MaximumValue |
+--------------+--------------+
|            5 |            30 |
+--------------+--------------+
1 row in set (0.00 sec)

結果の解説

この出力から、現在の日付が適用期間内にあるレコード(Id=1)では低価格の「5」が採用され、期間外のレコード(Id=2、Id=3)では高価格の「20」「30」が採用されていることがわかります。その結果、全体の最小値は「5」、最大値は「30」となりました。

このようにCASE文と MIN()/MAX() を組み合わせることで、日付による条件分岐を行いながら柔軟に集計できます。期間限定価格やセール価格のように有効期限を持つ価格を扱うシステムでは、特に役立つテクニックなので、ぜひ覚えておきましょう。

  1. MySQLテーブルで先頭ゼロ付きの値を選択して挿入する方法

    MySQLで連番に先頭ゼロ(先行ゼロ)を付けた値をテーブルに挿入したい場合は、INSERT INTO SELECT文とLPAD()関数を組み合わせることで実現できます。LPAD()は文字列を指定した長さまで左側を特定の文字で埋める関数で、これを使えば「001」「002」のような形式のIDを簡単に生成できます。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1967 ( Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, UserId varchar(20)

  2. MySQLで列にENUM型を設定する方法

    ```html MySQLでは、テーブルを作成する際に、あらかじめ決められた文字列のリストから値を選ばせたい列に対してENUM型を設定できます。ENUMは、指定した候補値以外のデータが登録されるのを防ぎたい場合に便利なデータ型です。ここでは、実際にテーブルを作成しながら基本的な使い方を見ていきましょう。ENUM型を含むテーブルを作成するまず、学生の点数と合否ステータスを管理するテーブルを作成します。「StudentStatus」列には「First」「Second」「Fail」の3つの値のみを許可するENUM型を設定しています。mysql> create table DemoTable20