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

นับและหารสองชุดข้อมูลใน MySQL (Conditional Aggregation)

นับจำนวนแถวตามเงื่อนไข แล้วนำมาหารกัน

ใช้ COUNT(*) ร่วมกับ WHERE หรือ CASE เพื่อนับแยกกลุ่ม แล้วนำผลลัพธ์มาคำนวณ (หาร, บวก, ลบ, คูณ)

ตัวอย่าง: นับแต่งงาน vs โสด แล้วหารกัน

CREATE TABLE DemoTable(isMarried TINYINT(1));

INSERT INTO DemoTable VALUES(1), (0), (1), (1), (1);

Query นับและหาร:

SELECT 
    (SELECT COUNT(*) FROM DemoTable WHERE isMarried = 1) /
    (SELECT COUNT(*) FROM DemoTable WHERE isMarried = 0) AS divide
FROM DUAL;

ผลลัพธ์: 4 / 1 = 4.0000

+--------+
| divide |
+--------+
| 4.0000 |
+--------+

วิธีที่ดีกว่า: Conditional Aggregation (Single Scan)

SELECT 
    SUM(CASE WHEN isMarried = 1 THEN 1 ELSE 0 END) AS married_count,
    SUM(CASE WHEN isMarried = 0 THEN 1 ELSE 0 END) AS single_count,
    SUM(CASE WHEN isMarried = 1 THEN 1 ELSE 0 END) / 
    NULLIF(SUM(CASE WHEN isMarried = 0 THEN 1 ELSE 0 END), 0) AS ratio
FROM DemoTable;

ข้อดี: Scan ตารางแค่ครั้งเดียว (Single Pass) เร็วกว่ามากตอนตารางใหญ่

ใช้ NULLIF ป้องกัน Divide by Zero

NULLIF(denominator, 0) จะคืน NULL ถ้าตัวหารเป็น 0 ป้องกัน Error "Division by zero"

รูปแบบทั่วไป (General Pattern)

SELECT 
    COUNT(*) AS total,
    SUM(condition1) AS count1,
    SUM(condition2) AS count2,
    SUM(condition1) / NULLIF(SUM(condition2), 0) AS ratio
FROM table_name;

ใน MySQL condition ที่เป็น Boolean จะมีค่า 1 (True) หรือ 0 (False) อัตโนมัติ จึงเขียน SUM(isMarried = 1) ได้เลย ไม่ต้อง CASE

ตัวอย่างลดรูป

SELECT 
    SUM(isMarried = 1) AS married,
    SUM(isMarried = 0) AS single,
    SUM(isMarried = 1) / NULLIF(SUM(isMarried = 0), 0) AS ratio
FROM DemoTable;