MySQL cho phép GROUP BY theo **biểu thức (expression)**, không chỉ tên cột. Điều này hữu ích khi muốn gom nhóm theo phạm vi giá trị (ví dụ: theo chục, trăm, tháng, v.v.).
Ví dụ: Gom nhóm ProductId theo chục (div 10) và tính tổng giá
Tạo bảng:
mysql> CREATE TABLE DemoTable1489 (
-> ProductId INT,
-> ProductPrice INT
-> );
Chèn dữ liệu:
mysql> INSERT INTO DemoTable1489 VALUES
-> (100, 900),
-> (115, 1000),
-> (119, 2100),
-> (125, 2100),
-> (128, 2900);
Truy vấn: chia ProductId cho 10 (phép chia nguyên DIV), gom nhóm, tính tổng giá:
mysql> SELECT ProductId DIV 10 AS IdGroup, SUM(ProductPrice) AS TotalPrice
-> FROM DemoTable1489
-> GROUP BY ProductId DIV 10;
Kết quả:
+---------+-------------+ | IdGroup | TotalPrice | +---------+-------------+ | 10 | 900 | -- ID 100-109 | 11 | 3100 | -- ID 110-119: 1000+2100 | 12 | 5000 | -- ID 120-129: 2100+2900 +---------+-------------+
Các biểu thức GROUP BY hữu ích khác
| Mục đích | Biểu thức |
|---|---|
| Nhóm theo tháng | GROUP BY YEAR(cot_ngay), MONTH(cot_ngay) hoặc GROUP BY DATE_FORMAT(cot_ngay, '%Y-%m') |
| Nhóm theo quý | GROUP BY QUARTER(cot_ngay) |
| Nhóm theo khoảng giá | GROUP BY FLOOR(gia/1000) (mỗi nhóm 1000 đơn vị) |
| Nhóm theo phần nguyên chia | GROUP BY id DIV 100 |
Lưu ý hiệu năng
- Biểu thức trong GROUP BY không dùng được index thông thường (trừ functional index MySQL 8.0+).
- Với bảng lớn, cân nhắc tạo cột tính toán (generated column) + index.