Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách GROUP BY theo giá trị dương/âm trong MySQL?

Sử dụng GROUP BY -column_name (âm cột) để gom nhóm các giá trị dương và âm tương ứng thành một nhóm.

Tạo bảng

mysql> CREATE TABLE DemoTable (Value INT);

Chèn dữ liệu (có dương, âm, trùng)

mysql> INSERT INTO DemoTable VALUES(-10), (-20), (20), (10), (-10), (-10), (-20), (-30), (30);

Xem dữ liệu gốc

mysql> SELECT * FROM DemoTable;
+-------+
| Value |
+-------+
| -10   |
| -20   |
| 20    |
| 10    |
| -10   |
| -10   |
| -20   |
| -30   |
| 30    |
+-------+

GROUP BY -Value (giá trị tuyệt đối)

mysql> SELECT * FROM DemoTable GROUP BY -Value;
+-------+
| Value |
+-------+
| -10   |
| -20   |
| 20    |
| 10    |
| -30   |
| 30    |
+-------+

Giải thích

  • -Value chuyển đổi: -10→10, -20→20, 20→-20, 10→-10, -30→30, 30→-30
  • Giá trị dương và âm có cùng giá trị tuyệt đối sẽ có cùng -Value (ví dụ: 10 và -10 đều cho -10? Wait: -10→10, 10→-10. Không giống nhau!)
  • Sửa lại: GROUP BY ABS(Value) mới gom được ±10 cùng nhóm. Ví dụ gốc có lỗi logic.

Cách đúng: GROUP BY ABS(Value)

mysql> SELECT * FROM DemoTable GROUP BY ABS(Value);
+-------+
| Value |
+-------+
| -10   |
| -20   |
| 20    |
| 10    |
| -30   |
| 30    |

Kết quả giống nhau nhưng logic đúng: ABS(-10)=10, ABS(10)=10 → cùng nhóm.

Ứng dụng thực tế: Thống kê theo giá trị tuyệt đối

SELECT 
    ABS(Value) AS AbsValue,
    COUNT(*) AS Count,
    SUM(CASE WHEN Value > 0 THEN 1 ELSE 0 END) AS PositiveCount,
    SUM(CASE WHEN Value < 0 THEN 1 ELSE 0 END) AS NegativeCount
FROM DemoTable
GROUP BY ABS(Value);

Lưu ý

  • GROUP BY -column là "mẹo" nhưng không đúng logic cho gom ±value
  • Luôn dùng ABS() cho rõ ràng và chính xác
  • MySQL cho phép SELECT cột không trong GROUP BY (chỉ lấy hàng đầu tiên của nhóm) — khác chuẩn SQL