SQL Tips 10 – GROUP BY nâng cao
Trong một số trường hợp nhất định các bạn có thể sẽ muốn nhóm dữ liệu (GROUP BY) theo nhiều chiều khác nhau, ví dụ như khi khám phá dữ liệu bằng SQL chẳng hạn. Trong những trường hợp này, các bạn có thể sử dụng các mệnh đề:
- GROUP BY ROLLUP
- GROUP BY CUBE
- GROUP BY GROUPING SETS
Trong bài này mình sẽ nói về GROUPING SETS vì mình thấy nó là mệnh đề hữu hiệu nhất trong 3 mệnh đề nêu trên.
Ví dụ ta có bảng dữ liệu sau:
| Store | Product | QuantitySold |
| A | P1 | 10 |
| B | P2 | 3 |
| C | P3 | 1 |
| A | P2 | 5 |
| B | P3 | 9 |
| C | P4 | 6 |
Ta viết query sử dụng GROUPING SETS như sau:
SELECT
Store,
Product,
SUM(QuantitySold) AS TotalQuantitySold
FROM store_sales
GROUP BY GROUPING SETS ((Store), (Product), ());
Ta được kết quả như sau:
| Store | Product | TotalQuantitySold |
| NULL | P1 | 10 |
| NULL | P2 | 8 |
| NULL | P3 | 10 |
| NULL | P4 | 6 |
| NULL | NULL | 34 |
| A | NULL | 15 |
| B | NULL | 12 |
| C | NULL | 7 |
Như vậy chỉ với 1 query ta đã thực hiện được việc nhóm dữ liệu và tính tổng số lượng sản phẩm đã bán được theo 2 cách nhóm khác nhau là theo Store và theo Product. Ngoài ra query còn cho ta biết tổng số lượng sản phẩm đã bán được của tất cả các cửa hàng cho tất cả các dòng sản phẩm (=34, dòng có Store và Product đều NULL).
Nếu không sử dụng GROUPING SETS thì để có được kết quả như trên ta phải viết 3 query sử dụng GROUP BY và UNION chúng lại với nhau như sau:
SELECT
NULL AS Store,
Product,
SUM(QuantitySold) AS TotalQuantitySold
FROM store_sales
GROUP BY Product
UNION
SELECT
Store,
NULL,
SUM(QuantitySold)
FROM store_sales
GROUP BY Store
UNION
SELECT
NULL,
NULL,
SUM(QuantitySold)
FROM store_sales;