Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL SUM Query กับเงื่อนไข IF ใน Stored Procedure

การใช้ 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');
PaymentModeTotalAmount
Online600

กรณี Offline

CALL sp_GetSumWithPaymentMode('Offline');
PaymentModeTotalAmount
Offline60

วิธีอื่น: 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;

ผลลัพธ์

OnlineTotalOfflineTotalGrandTotal
60060660

เทคนิคเพิ่มเติม

  • 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 หากต้องการแยกตามกลุ่มอื่นเพิ่ม (เช่น แยกตามเดือน)