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
-Valuechuyể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 -columnlà "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