SUM() แบบมีเงื่อนไข: จัดกลุ่มด้วย DIV (Integer Division)
ตัวอย่างนี้ใช้ DIV (หารจำนวนเต็ม) เพื่อจัดกลุ่ม ProductId เป็นช่วงๆ (100-109, 110-119, 120-129) แล้วคำนวณ SUM ของ ProductPrice ในแต่ละช่วง
สร้างตารางและข้อมูล
mysql> CREATE TABLE DemoTable1489 (
-> ProductId INT,
-> ProductPrice INT
-> );
Query OK, 0 rows affected (0.49 sec)
mysql> INSERT INTO DemoTable1489 VALUES
-> (100, 900), (115, 1000), (119, 2100), (125, 2100), (128, 2900);
Query OK, 5 rows affected
ข้อมูลทั้งหมด
+-----------+--------------+ | ProductId | ProductPrice | +-----------+--------------+ | 100 | 900 | | 115 | 1000 | | 119 | 2100 | | 125 | 2100 | | 128 | 2900 | +-----------+--------------+
คำสั่ง: จัดกลุ่มด้วย ProductId DIV 10 แล้ว SUM
mysql> SELECT ProductId DIV 10, SUM(ProductPrice)
-> FROM DemoTable1489
-> GROUP BY ProductId DIV 10;
ผลลัพธ์
+------------------+-------------------+ | ProductId div 10 | sum(ProductPrice) | +------------------+-------------------+ | 10 | 900 | | 11 | 3100 | | 12 | 5000 | +------------------+-------------------+
คำอธิบาย
| ProductId | DIV 10 | กลุ่ม | ProductPrice | SUM |
|---|---|---|---|---|
| 100 | 10 | 10 (100-109) | 900 | 900 |
| 115 | 11 | 11 (110-119) | 1000 | 3100 |
| 119 | 11 | 11 (110-119) | 2100 | |
| 125 | 12 | 12 (120-129) | 2100 | 5000 |
| 128 | 12 | 12 (120-129) | 2900 |
เทคนิค SUM แบบมีเงื่อนไขอื่นๆ (Conditional Aggregation)
-- SUM เฉพาะค่าที่มากกว่า 1000 SELECT SUM(CASE WHEN ProductPrice > 1000 THEN ProductPrice ELSE 0 END) FROM DemoTable1489; -- นับจำนวนที่มากกว่า 1000 SELECT SUM(CASE WHEN ProductPrice > 1000 THEN 1 ELSE 0 END) FROM DemoTable1489; -- หรือใช้ IF (MySQL specific) SELECT SUM(IF(ProductPrice > 1000, ProductPrice, 0)) FROM DemoTable1489;
สรุป
DIV= หารจำนวนเต็ม (Integer Division) ต่างจาก/ที่คืนค่าทศนิยม- เหมาะสำหรับจัดกลุ่มช่วงตัวเลข (Bucketing)
- ร่วมกับ
GROUP BYและSUM()ได้ผลลัพธ์สรุปแบบมีเงื่อนไข