นับจำนวนแถวตามเงื่อนไข แล้วนำมาหารกัน
ใช้ 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;