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;

Add a Comment

Your email address will not be published.