Trong Power BI, CALCULATE là một trong những hàm tính toán quan trọng nhất. Hàm CALCULATE cho phép tính toán một biểu thức trong một Filter Context được thay đổi bởi những điều kiện lọc mà người dùng đưa vào bên trong hàm này. Bên cạnh hàm CALCULATE, Power BI còn có hàm CALCULATETABLE cũng có sức mạnh và tính chất khá tương đồng.
Hôm nay Datapot sẽ giúp bạn đọc tìm hiểu sâu hơn về hàm CALCULATETABLE cũng như phân biệt nó với hàm CALCULATE.
Mục lục
Mục đích của hàm CALCULATETABLE
CALCULATETABLE là hàm DAX dùng để thay đổi ngữ cảnh tính toán (Context) hoặc tạo ra các bảng tính toán với các điều kiện bộ lọc khác nhau. Giá trị trả về của hàm CALCULATETABLE là 1 table. Mục đích chính của hàm CALCULATETABLE là để tính toán các chỉ tiêu trong nhiều điều kiện filter hoặc context khác nhau.
Cú pháp và cách sử dụng CALCULATETABLE
CALCULATETABLE(<expression>[, <filter1> [, <filter2> [, …]]])
Trong đó:
Biến | Định nghĩa |
expression | Tên bảng hoặc một hàm DAX có giá trị trả ra là table. Bảng này sẽ được dùng như một bảng dữ liệu tính toán hoặc filter. |
filter1, filter2,… | (Tùy chọn) Các nhóm hàm filter hoặc thay đổi context. Nhóm hàm filter có thể là Boolean filter hoặc Table filter. |
Ví dụ:
Ta có thể tạo một bảng mới với các điều kiện lọc từ bảng gốc. Ví dụ chúng ta có bảng InternetSale chứa dữ liệu bán hàng, chúng ta có thể dùng CALCULATETABLE để tạo ra bảng mới chỉ chứa các đơn hàng của nhân viên Hà Huy F trong năm 2019.
Kết quả ta được 1 bảng mới chỉ chứa các đơn hàng của nhân viên Hà Huy F trong năm 2019.
Bảng Internet Sales | Bảng kết quả trả ra từ biểu thức trên |
Phân biệt CALCULATETABLE và CALCULATE
Giống nhau | Khác nhau |
Đều là nhóm hàm có thể sử dụng cho việc thay đổi ngữ cảnh tính toán (Context) hoặc bộ lọc (Filter). | 2 hàm này có điểm khác nhau duy nhất đó là giá trị trả về. Hàm CALCULATE trả về kết quả của một phép tính toán cụ thể (Ví dụ như SUM, AVERAGE…), trong khi đó hàm CALCULATETABLE có giá trị trả về là một Table. |
Ứng dụng của hàm CALCULATETABLE:
- Tạo ra 1 bảng con bằng cách lọc từ một bảng bằng cách đưa các điều kiện lọc vào bên trong hàm CALCULATETABLE
- Sử dụng kết hợp với các hàm DAX tính toán Iterator Function (Ví dụ như SUMX, AVERAGEX…) để tính toán biểu thức.
- Thực hiện một số tính toán phức tạp liên quan đến việc so sánh giữa các khoảng thời gian khác nhau như tỷ lệ khách hàng quay lại, tỷ lệ khách hàng re-active trong một khoảng thời gian…
- Sử dụng kết hợp hàm CALCULATETABLE với hàm FILTERS.
Usecase thực tế:
Mô tả bộ dữ liệu:
Chúng ta có bảng dữ liệu bán hàng InternetSale bao gồm 3 cột thông tin: Orderdate, CustomerKey, CustomerName và SaleAmount.

Ngoài ra, chúng ta sẽ có 1 bảng Dim_date (Giống ảnh bên dưới). Hai bảng sẽ kết nối với nhau qua cột date.

Đề bài:
Ta cần đếm xem số lượng khách hàng mới phát sinh trong năm nay so với năm ngoái là bao nhiêu. Các khách hàng trong năm ngoái không có mà năm nay lại có thì sẽ được tính là mới.
Cách xử lý:
Chúng ta sẽ lấy ra chi tiết các khách hàng có trong năm nay và có trong năm ngoái. Sau đó chúng ta sẽ so sánh xem trong danh sách khách hàng năm nay, khách hàng nào là khách hàng mới (Không có trong danh sách khách hàng năm ngoái). Sau cùng chúng ta đếm xem số lượng Khách hàng đó là bao nhiêu.
Chi tiết hàm DAX và giải thích:
Công thức DAX của chúng ta sẽ có dạng như sau:
Output khi được visualize và so sánh với số Khách hàng hàng năm sẽ có dạng:

Tại công thức này, chúng ta sẽ sử dụng cấu trúc VAR RETURN cho dễ hình dung.
Biến THIS_YEAR sẽ giúp lưu lại danh sách Khách hàng phát sinh trong năm nay. Cụ thể trong biến này, hàm CALCULATETABLE kết hợp với bộ lọc DATEADD sẽ tạo ra context là các đơn hàng trong năm nay. Kết hợp với hàm VALUES, Power BI sẽ trả ra danh sách các Khách hàng có trong năm nay.
Tương tự như logic trên, biến PREVIOUS_YEAR sẽ trả ra danh sách các Khách hàng phát sinh trong năm ngoái.
Sau cùng, ta kết hợp với hàm EXCEPT để xác định xem Khách hàng nào có trong THIS_YEAR mà không có trong list PREVIOUS_YEAR và đếm số Khách hàng đó. Như vậy, ta đã có được kết quả mong muốn.
Lưu ý:
Có thể nhiều bạn sẽ nghĩ đến ý tưởng dùng hàm FILTER để thay thế cho CALCULATETABLE trong trường hợp này. Mặc dù hàm FILTER cũng có kết quả trả ra là 1 table, tuy nhiên ta không thể lấy riêng được cột “CustomerKey” và đếm số khách hàng tại năm nay cũng như năm ngoái. Vì vậy trong trường hợp này, ta bắt buộc phải dùng hàm CALCULATETABLE kết hợp với điều kiện filter để tính toán.
Tổng kết lại, CALCULATETABLE là hàm DAX cho phép chúng ta linh hoạt thay đổi các context khác nhau và tạo ra table, phục vụ cho các công thức tính toán phức tạp. Hàm CALCULATETABLE thường được dùng với các loại Filter hoặc Filter modification functions, tương tự với hàm CALCULATE. Chỉ khác biệt ở kết quả trả ra giữa hai hàm.