Khóa học
Hàm CALCULATE() có lẽ là một trong những hàm DAX quan trọng (và phổ biến) nhất của Power BI. Nó dễ dùng và vô cùng linh hoạt, cho phép bạn mở rộng phân tích dữ liệu và xây dựng các báo cáo Power BI giá trị hơn.
Bài hướng dẫn này tập trung vào việc hàm CALCULATE() là gì và cách sử dụng, đồng thời giả định bạn đã quen với những kiến thức cơ bản về Power BI và DAX.
Hàm Calculate() trong Power BI là gì?
Theo tài liệu Microsoft Power BI, hàm CALCULATE() thuộc nhóm hàm bộ lọc (filter) và được định nghĩa là "đánh giá một biểu thức trong bối cảnh bộ lọc đã được sửa đổi". Về bản chất, một biểu thức chính là một measure và bao gồm các hàm như SUM(), AVERAGE() và COUNT(). Biểu thức này được đánh giá trong bối cảnh của một hoặc nhiều bộ lọc.
Như bạn biết, các bộ lọc cũng có thể được áp dụng lên một báo cáo Power BI chỉ bằng cách thêm slicer mà không cần tạo measure với hàm CALCULATE(). Tuy nhiên, có rất nhiều trường hợp sử dụng mà hàm CALCULATE() phù hợp hơn. Nó đặc biệt hữu ích khi dùng như một thành phần của hàm khác. Chúng ta sẽ xem cách hoạt động này trong ví dụ bên dưới để tính phần trăm trên tổng.
Cú pháp cơ bản của DAX Calculate()
Cú pháp DAX cơ bản của hàm CALCULATE() là:
CALCULATE( <expression> [, <filter1> [, <filter2> [, ...]]])
Hàm CALCULATE() gồm 2 thành phần chính:
-
Biểu thức - đây là phần tổng hợp (aggregation) được xây dựng giống như một measure bằng các hàm như
SUM(),AVERAGE()vàCOUNT(). -
Các bộ lọc - thành phần này cho phép bạn chỉ định một hoặc nhiều bộ lọc điều khiển bối cảnh của phép tổng hợp.
Có 3 loại bộ lọc có thể dùng trong hàm CALCULATE():
-
Biểu thức lọc Boolean - đây là bộ lọc đơn giản với kết quả phải là
TRUEhoặcFALSE. -
Biểu thức lọc dạng bảng - đây là bộ lọc phức tạp hơn với kết quả là một bảng.
-
Các hàm sửa đổi bộ lọc - các bộ lọc như
ALLvàKEEPFILTERSthuộc nhóm này, giúp bạn kiểm soát chi tiết hơn bối cảnh bộ lọc muốn áp dụng.
Bạn có thể thêm nhiều bộ lọc vào thành phần bộ lọc của hàm CALCULATE() bằng cách ngăn cách mỗi bộ lọc bằng dấu phẩy. Tất cả bộ lọc được đánh giá cùng nhau và thứ tự không quan trọng.
Bạn có thể kiểm soát cách các bộ lọc được đánh giá bằng cách dùng các toán tử logic. Nếu bạn muốn mọi điều kiện đều phải đánh giá là TRUE thì có thể dùng AND (&&). Đây cũng là hành vi mặc định như đã đề cập. Ngoài ra, với toán tử OR (||), chỉ cần ít nhất một điều kiện đánh giá là TRUE để trả về kết quả.
Cách sử dụng Power BI Calculate()
Để dùng CALCULATE(), chỉ cần thêm một measure vào bảng của bạn. Bạn có thể thực hiện bằng cách chuyển đến thẻ Modeling trên ribbon và chọn New measure.

Chọn New measure trong thẻ Modeling của Power BI. Ảnh: Tác giả
Dưới đây là một ví dụ đơn giản về hàm CALCULATE() dùng SUM() để tìm tổng doanh thu và lọc theo Country = United Kingdom. Chúng ta sẽ bàn lại ví dụ này chi tiết hơn ở cuối bài hướng dẫn.
UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
'Online Retail'[Country] = "United Kingdom")
Khi xem trong một bảng, ta thấy measure UK Revenue đơn giản là áp dụng bộ lọc cho Country bên cạnh bối cảnh lọc vốn đã có trong bảng cho Month. Sử dụng hàm CALCULATE() theo cách này giúp chúng ta kiểm soát chi tiết hơn loại thông tin được hiển thị trong biểu đồ trực quan.
Bảng doanh thu trong Power BI. Ảnh: Tác giả
Một điều quan trọng cần lưu ý khi tạo measure là tuân theo thực hành mô hình dữ liệu tốt, đặc biệt về tốc độ và tối ưu truy vấn. Vì vậy, một số cách dùng hàm CALCULATE() sẽ nhanh hơn hoặc phù hợp hơn các cách khác.
Ví dụ, tài liệu của Microsoft khuyến nghị tránh dùng hàm FILTER() làm đối số cho các hàm khác (như trong CALCULATE()). Thay vào đó, tốt hơn nên dùng biểu thức boolean khi có thể vì chúng đã được tối ưu cho mục đích này.
Trong ví dụ trên, chúng ta dùng biểu thức boolean để định nghĩa bộ lọc Country = United Kingdom. Đây là cách tiếp cận nhanh và tối ưu hơn. Mặt khác, dưới đây là ví dụ dùng hàm FILTER() cho cùng kết quả nhưng tính toán chậm hơn:
UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
FILTER('Online Retail',
'Online Retail'[Country] = "United Kingdom")
Ví dụ về hàm Power BI Calculate()
Sử dụng một bộ dữ liệu thương mại điện tử thực tế, chúng ta sẽ khám phá một vài cách chính mà hàm CALCULATE() có thể được dùng để giải quyết bài toán kinh doanh. Để theo dõi bài hướng dẫn, bạn có thể truy cập bộ dữ liệu e-commerce được lưu trữ trên DataLab.
Bộ dữ liệu này chứa thông tin về mỗi giao dịch mua của khách hàng: quốc gia mua hàng, mô tả sản phẩm, ngày giờ mua, số lượng và giá của từng sản phẩm.
Chúng ta sẽ trả lời các câu hỏi sau với sự trợ giúp của hàm CALCULATE():
- Tổng doanh thu theo tháng ở Anh so với các quốc gia khác như thế nào?
- Bao nhiêu phần trăm tổng doanh thu đến từ Anh?
- Doanh thu lũy kế theo ngày là bao nhiêu?
Tổng doanh thu theo tháng ở Anh so với các quốc gia khác như thế nào?
Để trả lời câu hỏi này, chúng ta cần tạo hai measure dùng hàm CALCULATE(). Trước tiên, dùng một bộ lọc boolean đơn giản để tạo measure trả về tổng doanh thu (dùng hàm SUM()) tại Anh:
UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
'Online Retail'[Country] = "United Kingdom")
Tiếp theo, tạo một measure tương tự nhưng lần này dùng hàm FILTER(). Biểu thức lọc này duyệt qua từng dòng của cột Country và trả về một bảng chứa các dòng khớp điều kiện lọc. Ở đây cần dùng hàm FILTER() vì chúng ta không thể trả về đơn thuần TRUE hoặc FALSE từ bộ lọc; thay vào đó, kết quả là một bảng với nhiều giá trị.
Non-UK Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
FILTER('Online Retail',
'Online Retail'[Country] <>"United Kingdom")
Do đó, ta có thể thấy Anh chiếm phần lớn doanh thu của cửa hàng thương mại điện tử này so với tất cả các quốc gia khác.
Biểu đồ đường trong Power BI thể hiện doanh thu theo tháng. Ảnh: Tác giả.
Bao nhiêu phần trăm tổng doanh thu đến từ Anh?
Đây là dạng câu hỏi rất phổ biến với người dùng và nhà phát triển Power BI, và là trường hợp hoàn hảo để áp dụng hàm CALCULATE().
Để tìm phần trăm trên tổng, trước hết chúng ta cần có thể trả về tổng số không bị ảnh hưởng bởi các bối cảnh lọc khác trong báo cáo. Để đạt được điều này, ta dùng một hàm sửa đổi bộ lọc là ALL(). Với hàm này, ta chỉ định cột mà phép tính cần hoàn toàn bỏ qua mọi bộ lọc.
Trong ví dụ này, chúng ta tìm phần trăm doanh thu từ Anh. Điều này có nghĩa là phép tính nên bỏ qua các bộ lọc trên cột Country.
Total Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
ALL('Online Retail'[Country]))
Điều này liên quan vì CALCULATE() có thể được thực thi từ bên trong một bối cảnh lọc vốn đã lọc Product[Color]. Trong kịch bản đó, sự xuất hiện của ALL có nghĩa là bộ lọc bên ngoài trên Product[Color] bị bỏ qua và được thay thế bằng bộ lọc mới do CALCULATE() đưa vào. Điều này thể hiện rõ nếu, thay vì cắt theo Brand, ta cắt theo Color trong ma trận.
Giờ chúng ta đã biết tổng doanh thu, có thể xây dựng một measure để hiển thị phần trăm doanh thu trên tổng. Tuy nhiên, vì chúng ta quan tâm cụ thể đến Anh, nên sẽ dùng lại hàm CALCULATE nhưng lần này với một bộ lọc boolean đơn giản.()
UK % of Revenue = CALCULATE(SUM('Online Retail'[Revenue])/[Total Revenue],
'Online Retail'[Country] = "United Kingdom")
Bây giờ chúng ta thấy rằng Anh chiếm 84% tổng doanh thu của cửa hàng thương mại điện tử này.
Tính phần trăm trong Power BI. Ảnh: Tác giả
Doanh thu lũy kế theo ngày là bao nhiêu?
Doanh thu lũy kế có thể cho thấy xu hướng doanh thu. Khi vẽ doanh thu lũy kế trên biểu đồ, ta cũng có thể quan sát trực quan tốc độ tăng doanh thu theo thời gian.
Để trả lời câu hỏi này, chúng ta cần tạo một measure dùng hàm CALCULATE() cùng với các hàm lọc: ALLSELECTED(), FILTER() và một phép đánh giá dùng hàm MAX().
Cumulative Revenue = CALCULATE(SUM('Online Retail'[Revenue]),
FILTER( ALLSELECTED('Online Retail'[InvoiceDate]),
'Online Retail'[InvoiceDate] <= MAX('Online Retail'[InvoiceDate])))
Hãy điểm qua vì sao các bộ lọc này quan trọng ở đây:
-
Hàm
FILTER()cho phép mỗi trong 2 bộ lọc chúng ta chỉ định được đánh giá theo từng dòng và sẽ trả về một bảng trong những trường hợp khớp điều kiện. -
Hàm
ALLSELECTED()đặt lại bộ lọc trên InvoiceDate trong truy vấn hiện tại (trong kết quả dưới đây, truy vấn hiện tại là biểu đồ đường) đồng thời vẫn cho phép các bộ lọc bên ngoài (ví dụ từ slicer). -
Hàm
MAX()được dùng như một phần của phép đánh giá — chúng ta muốn cộng doanh thu cho tất cả các ngày nhỏ hơn hoặc bằng ngày hiện tại trong truy vấn.
Tính doanh thu theo ngày trong Power BI. Ảnh: Tác giả.
Kết luận
Trong bài hướng dẫn này, chúng ta đã tìm hiểu hàm CALCULATE() trong Power BI và cách sử dụng. Chúng ta cũng áp dụng hàm CALCULATE() lên một bộ dữ liệu e-commerce thực tế và dùng nó để trả lời một số câu hỏi kinh doanh quan trọng.
CALCULATE() là một trong những hàm hữu ích nhất trong Power BI và bạn có thể sẽ cần dùng thường xuyên khi xây dựng báo cáo và khai thác sâu hơn các insight từ dữ liệu.
Hy vọng bài hướng dẫn này giúp bạn không chỉ hiểu cú pháp cơ bản của CALCULATE() mà còn thấy được cách nó liên quan đến việc giải quyết các bài toán kinh doanh thực tế với vai trò chuyên viên phân tích dữ liệu Power BI.