การใช้ SUM() ร่วมกับ IF() ใน Stored Procedure
ฟังก์ชัน SUM() เป็น Aggregate Function ที่สามารถรวมกับ IF() เพื่อ Sum แบบมีเงื่อนไข (Conditional Sum) ได้
ตัวอย่างการใช้งานจริง
1. สร้างตารางการชำระเงิน
CREATE TABLE SumWithIfCondition (
ModeOfPayment VARCHAR(100),
Amount INT
);
2. เพิ่มข้อมูลตัวอย่าง
INSERT INTO SumWithIfCondition VALUES
('Offline', 10), ('Online', 100),
('Offline', 20), ('Online', 200),
('Offline', 30), ('Online', 300);
3. สร้าง Stored Procedure
DELIMITER //
CREATE PROCEDURE sp_GetSumWithPaymentMode(IN PaymentMode VARCHAR(200))
BEGIN
SELECT
PaymentMode,
SUM(IF(ModeOfPayment = PaymentMode, Amount, 0)) AS TotalAmount
FROM SumWithIfCondition;
END //
DELIMITER ;
4. เรียกใช้ Procedure
กรณี Online
CALL sp_GetSumWithPaymentMode('Online');
| PaymentMode | TotalAmount |
| Online | 600 |
กรณี Offline
CALL sp_GetSumWithPaymentMode('Offline');
| PaymentMode | TotalAmount |
| Offline | 60 |
วิธีอื่น: Conditional Aggregation (ไม่ต้อง Procedure)
SELECT
SUM(IF(ModeOfPayment = 'Online', Amount, 0)) AS OnlineTotal,
SUM(IF(ModeOfPayment = 'Offline', Amount, 0)) AS OfflineTotal,
SUM(Amount) AS GrandTotal
FROM SumWithIfCondition;
ผลลัพธ์
| OnlineTotal | OfflineTotal | GrandTotal |
| 600 | 60 | 660 |
เทคนิคเพิ่มเติม
- CASE WHEN (ANSI Standard):
SUM(CASE WHEN ModeOfPayment='Online' THEN Amount ELSE 0 END)
- COUNT IF:
COUNT(IF(ModeOfPayment='Online', 1, NULL)) หรือ SUM(ModeOfPayment='Online') (True=1, False=0)
- FILTER Clause (PostgreSQL, MySQL 8.0.2+ ไม่รองรับ):
SUM(Amount) FILTER (WHERE ModeOfPayment='Online')
- Index: สร้าง Index บน ModeOfPayment เพื่อ Query เร็วขึ้น
ข้อควรระวัง
- ⚠️
IF() ใน MySQL มี 3 อาร์กิวเมนต์: IF(condition, true_value, false_value)
- 🔄
IFNULL() vs IF(): IFNULL(expr1, expr2) คืน expr2 ถ้า expr1 เป็น NULL
- 📊 ใช้
GROUP BY หากต้องการแยกตามกลุ่มอื่นเพิ่ม (เช่น แยกตามเดือน)