GROUPBY và SUMMARIZE đều là các hàm dùng để nhóm dữ liệu theo cột. Tuy nhiên, hai hàm này có sự khác nhau về hiệu năng và cách vận hành. Vậy khi nào chúng ta dùng GROUPBY hoặc SUMMARIZE? Cùng tìm hiểu bài viết bên dưới nhé.
Mục lục
Tìm hiểu về cách hoạt động của SUMMARIZE
- Mục đích sử dụng: Hàm SUMMARIZE được sử dụng để tạo bảng tổng hợp bằng cách nhóm các cột dữ liệu hiện có.
- Cấu trúc:
SUMMARIZE (<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…) Chúng ta hãy cùng xem một ví dụ bên dưới nhé:
Mình có bảng dữ liệu về thông tin sản phẩm gồm loại sản phẩm (Product), thương hiệu (Brand), số lượng (Quantity) và doanh số bán (SalesAmount).

Mình có nhu cầu muốn tạo ra một bảng dữ liệu, thể hiện doanh số theo từng thương hiệu như kết quả bên dưới:

Mình sẽ chọn New Table và gõ công thức là:

Bây giờ, mình lại có nhu cầu muốn tính toán doanh số trên toàn bộ thương hiệu. Khi đó, kết quả mong muốn của mình là:

Để tính được doanh số trên toàn bộ thương hiệu, mình phải kết hợp thêm hàm có thể giúp mình loại bỏ được ngữ cảnh của bộ lọc (ở đây bộ lọc của mình đang là Brand) và mình sẽ dùng hàm REMOVEFILTERS để loại bỏ bộ lọc này.
Các bạn có thể tham khảo thêm cách sử dụng hàm REMOVEFILTERS tại đây.
Công thức của mình sẽ như sau:
Tuy nhiên, rất tiếc là công thức trên không trả về đúng kết quả mà mình mong muốn.

Tại sao lại như vậy? Lý do là vì bản chất của hàm SUMMARIZE sẽ hoạt động theo dạng phân cụm (cluster), ở đây cột Brand được gọi là 1 cụm, tương tự cột Product và Quantity cũng vậy. Khi chúng ta tiến hành gom nhóm và loại bỏ bộ lọc của cột Brand, hàm này sẽ gom các dòng giá trị giống nhau trong cụm Brand này và bỏ qua chúng, nhưng các cụm còn lại thì không. Do đó, kết quả trả về vẫn không như mong muốn. Chúng ta sẽ cùng xem lại bảng dữ liệu gốc và mình sẽ giải thích chi tiết hơn.

Trước tiên, mình sẽ giải thích vì sao từ bảng dữ liệu gốc bên tay trái, công thức lại trả về kết quả Pedro có giá trị là 500.

Mặc dù Pedro có 2 dòng sản phẩm là Dress và Shirt như trên dòng 1 và 2, tuy nhiên vì công thức đã loại bỏ bộ lọc của cột Brand nên hàm SUMMARIZE sẽ tiếp tục gom các giá trị giống nhau ở hai cột Product và Quantity để tiến hành phân cụm. Chúng ta có thể thấy rằng, ở dòng 2 và 3, dữ liệu của chúng ta đều là Product= Shirt và Quantity = 2 nên hai dòng này sẽ được gom thành 1 cụm để tiến hành tính tổng SalesAmount. Do đó, chúng ta sẽ được kết quả SalesAmount (Pedro)= 100+200+200= 500.
Tương tự, với thương hiệu Mango, hàm sẽ gom Shirt (dòng 2) + Shirt (dòng 3) + Shirt (dòng 5) và Dress (dòng 4) + Dress (dòng 6) để trả ra kết quả SalesAmount (Mango) = 200+200+300+300+300= 1300.
Với thương hiệu GAP, hàm sẽ gom Dress (dòng 4) + Dress (dòng 6) và Shirt (dòng 7) để trả ra kết quả SalesAmount (GAP)= 300+300+400 =1000
Đến đây, các bạn đã hiểu về khái niệm phân cụm (cluster) của hàm SUMMARIZE chưa? Khá là khó hiểu và phức tạp đúng không? Vì vậy, trong những trường hợp cần tính toán tương tự, các bạn không nên sử dụng hàm này, mà thay vào đó có thể nghĩ đến hàm SUMMARIZECOLUMNS được viết như sau:
Tóm lại, hàm SUMMARIZE hoạt động theo dạng phân cụm (cluster). Vì vậy, để tránh trả ra kết quả không mong muốn hoặc làm giảm hiệu năng, chúng ta không nên dùng để tính toán các biểu thức liên quan đến ngữ cảnh hàng (row context) và ngữ cảnh bộ lọc (filter context).
Tìm hiểu về cách hoạt động của GROUPBY
GROUPBY có mục đích sử dụng tương tự hàm SUMMARIZE. Tuy nhiên, hàm này không áp dụng với các tính toán tự động (Implicit Calculate) mà thường sẽ kết hợp thêm với hàm CURRENTGROUP để tổng hợp các cột được gom nhóm.
Cấu trúc:
GROUPBY (<table> [, <groupBy_columnName> [, <groupBy_columnName> [, …]]] [, <name>, <expression> [, <name>, <expression> [, …]]])Chúng ta hãy cùng thực hiện lại ví dụ tạo ra bảng dữ liệu thể hiện doanh số theo từng thương hiệu như trên, nhưng lúc này mình sẽ dùng hàm GROUPBY để thay thế nhé:

Cách thực hiện cũng tương tự hàm SUMMARIZE, chúng ta sẽ chọn New Table và gõ công thức:
Khác với hàm SUMMARIZE, ở đây chúng ta cần sử dụng SUMX (thay vì SUM) và kết hợp thêm hàm CURRENTGROUP.
Vì sao lại có sự kết hợp như vậy? Bởi vì cách thức hoạt động của GROUPBY là sẽ nhóm các cột dữ liệu, mỗi nhóm là một hàng trong kết quả nhưng lại đại diện cho một tập hợp các hàng trong bảng gốc. Ngoài ra, GROUPBY còn có một hạn chế là không được sử dụng để chuyển đổi ngữ cảnh (context transition).
Tóm lại, GROUPBY là hàm phù hợp để sử dụng khi chúng ta cần tạo một bảng nhỏ bằng các hàm DAX khác, để rồi tiếp tục nhóm dữ liệu trong 1 cột trên cơ sở từng dòng.
Tổng hợp so sánh giữa SUMMARIZE & GROUPBY
| Hạng mục | SUMMARIZE | GROUPBY |
| Mục đích sử dụng | Tạo bảng tổng hợp bằng cách nhóm các cột dữ liệu | |
| Cấu trúc hàm | SUMMARIZE (<table>, <groupBy_columnName>[, <groupBy_columnName>]…[, <name>, <expression>]…) | GROUPBY (<table> [, <groupBy_columnName> [, <groupBy_columnName> [, …]]] [, <name>, <expression> [, <name>, <expression> [, …]]]) |
| Cách hoạt động | Hoạt động theo dạng phân cụm (cluster), do đó hàm hoạt động tốt khi phân nhóm dựa trên các cột có trong mô hình dữ liệu. | Không hoạt động theo dạng phân cụm nhưng cần tạo ra bảng vật lý trước phân nhóm nên không tối ưu khi nhóm dữ liệu theo các cột trong mô hình. |
| Lưu ý khi sử dụng | Không nên dùng để tính toán các biểu thức liên quan đến ngữ cảnh hàng (row context) và ngữ cảnh bộ lọc (filter context) | Không nên dùng để thay đổi ngữ cảnh (context transition) |
Kết luận
SUMMARY và GROUPBY đều là các hàm mạnh mẽ để gom nhóm dữ liệu, tuy nhiên tùy vào mục đích và trong các trường hợp cụ thể, chúng ta nên tỉnh táo để lựa chọn đúng loại phù hợp. Một cách khôn ngoan là chúng ta nên kết hợp chúng lại với nhau, sử dụng ưu thế của từng loại để có thể tối ưu hiệu năng của công thức.
