Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 날짜 조건에 따라 가격의 최솟값과 최댓값 조회하기 – CASE 문 활용법

MySQL에서 특정 날짜 범위를 기준으로 조건부 선택을 수행하면서 테이블에 저장된 가격의 최솟값과 최댓값을 구하려면 CASE 문을 활용해야 합니다. 핵심은 CASE 문을 집계 함수인 MIN()MAX()로 감싸는 것입니다.

기본 문법

아래는 오늘 날짜(CURDATE())가 시작일과 종료일 사이에 있으면 하한가(LowerPrice)를, 그렇지 않으면 상한가(HigherPrice)를 반환하도록 처리하는 문법입니다.

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;

예제 테이블 생성하기

문법을 실제로 이해하기 위해 예제 테이블을 만들어 보겠습니다. 아래 쿼리로 테이블을 생성합니다.

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)

결과를 보면 현재 날짜가 시작일과 종료일 사이에 포함되지 않은 첫 번째 행(2019-01-02 ~ 2019-04-02)은 상한가인 10이 아니라 조건 평가 결과에 따라 값이 반영되고, 전체 행 중에서 MIN()은 5, MAX()는 30을 반환한 것을 확인할 수 있습니다. 이처럼 CASE 문과 집계 함수를 조합하면 날짜 조건에 따라 유연하게 가격 데이터를 집계할 수 있습니다.