Conditional Aggregation: หา Min/Max ราคาตามช่วงวันที่
ใช้ CASE ภายใน Aggregate Functions (MIN(), MAX()) เพื่อเลือกค่าราคาตามเงื่อนไขวันที่
ไวยากรณ์
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 yourTableName;
ตัวอย่างการใช้งาน
สร้างตารางราคาตามช่วงโปรโมชั่น:
CREATE TABLE ConditionalSelect (
Id INT NOT NULL AUTO_INCREMENT,
StartDate DATETIME,
EndDate DATETIME,
LowerPrice INT,
HigherPrice INT,
PRIMARY KEY(Id)
);
เพิ่มข้อมูล:
INSERT INTO ConditionalSelect(StartDate, EndDate, LowerPrice, HigherPrice) VALUES('2019-01-02', '2019-04-02', 5, 10);
INSERT INTO ConditionalSelect(StartDate, EndDate, LowerPrice, HigherPrice) VALUES('2019-04-02', '2019-04-20', 0, 20);
INSERT INTO ConditionalSelect(StartDate, EndDate, LowerPrice, HigherPrice) VALUES('2019-04-03', '2019-04-21', 0, 30);
สมมติวันนี้ = 2019-01-15 (อยู่ในช่วงแถวแรก):
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: วันนี้อยู่ในช่วง -> ใช้ LowerPrice = 5
- แถวที่ 2-3: วันไม่อยู่ในช่วง -> ใช้ HigherPrice = 20, 30
- MIN = 5, MAX = 30
การประยุกต์ใช้: Pricing Engine
-- ราคาสินค้าตามโปรโมชั่นปัจจุบัน
SELECT product_id,
MIN(CASE WHEN CURDATE() BETWEEN promo_start AND promo_end THEN promo_price ELSE regular_price END) AS current_price
FROM product_pricing
GROUP BY product_id;
วิธีอื่น: ใช้ IF() (MySQL Only)
SELECT
MIN(IF(CURDATE() BETWEEN StartDate AND EndDate, LowerPrice, HigherPrice)) AS MinimumValue,
MAX(IF(CURDATE() BETWEEN StartDate AND EndDate, LowerPrice, HigherPrice)) AS MaximumValue
FROM ConditionalSelect;
ข้อควรระวัง
BETWEENรวมทั้งสองขอบ (inclusive)- NULL ในราคาจะถูกข้ามโดย MIN/MAX อัตโนมัติ
- Performance: CASE ภายใน Aggregate ทำงานได้ดี แต่ไม่ใช้ Index สำหรับเงื่อนไข CASE