เทคนิคพิเศษ: ใช้ GROUP BY -column_name (Negative Column) เพื่อจัดกลุ่มค่าบวกและลบแยกกัน เพราะ -(-10) = 10 และ -(10) = -10 → ค่าบวก/ลบเดิมจะกลายเป็นค่าเดียวกันในกลุ่ม
สร้างตารางและข้อมูล (มีทั้งบวกและลบ)
mysql> create table DemoTable (Value int);
mysql> insert into DemoTable values (-10),(-20),(20),(10),(-10),(-10),(-20),(-30),(30);
ข้อมูลในตาราง
+-------+ | Value | +-------+ | -10 | | -20 | | 20 | | 10 | | -10 | | -10 | | -20 | | -30 | | 30 | +-------+
คำสั่ง GROUP BY -Value
mysql> select * from DemoTable group by -Value;
ผลลัพธ์: 6 กลุ่ม (-10,-20,20,10,-30,30)
+-------+ | Value | +-------+ | -10 | | -20 | | 20 | | 10 | | -30 | | 30 | +-------+
ทำไมถึงได้? (Logic)
| Value | -Value | Group Key |
|---|---|---|
| -10 | 10 | Group A |
| -10 | 10 | Group A |
| -10 | 10 | Group A |
| 10 | -10 | Group B |
| -20 | 20 | Group C |
| -20 | 20 | Group C |
| 20 | -20 | Group D |
| -30 | 30 | Group E |
| 30 | -30 | Group F |
→ -10 และ 10 ต่างกลุ่ม (10 vs -10) → แยกกัน ✓
เปรียบเทียบ GROUP BY ธรรมดา
-- GROUP BY Value (ปกติ) SELECT Value, COUNT(*) FROM DemoTable GROUP BY Value; -- -30(1), -20(2), -10(3), 10(1), 20(1), 30(1) = 6 กลุ่ม (เหมือนกัน) -- GROUP BY ABS(Value) (รวมบวกลบ) SELECT ABS(Value) AS abs_val, COUNT(*) FROM DemoTable GROUP BY ABS(Value); -- 10(4), 20(3), 30(2) = 3 กลุ่ม
กรณีใช้งาน
- ต้องการแยก Positive/Negative เป็นคนละกลุ่ม (Signed Grouping)
- Accounting: Debit (Positive) vs Credit (Negative) แยกนับ
- Physics: Vector Direction
คำเตือน
- เทคนิค "Trick" อ่านยาก Maintenance ยาก
- แนะนำใช้
CASE WHEN Value > 0 THEN 'Positive' ELSE 'Negative' END AS sign_groupแทน GROUP BY sign_group, Value- ชัดเจนกว่า
Best Practice: Explicit Grouping
-
-
-
-