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

GROUP BY ค่าบวก/ลบ แยกกันใน MySQL ด้วยค่าลบของคอลัมน์

เทคนิคพิเศษ: ใช้ 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-ValueGroup Key
-1010Group A
-1010Group A
-1010Group A
10-10Group B
-2020Group C
-2020Group C
20-20Group D
-3030Group E
30-30Group 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