[DAX Tutorial] Cách sử dụng hàm Calculate trong Power BI

Khi bắt đầu làm quen với DAX trong Power BI, có một hàm mà bất kỳ nhà phân tích dữ liệu nào cũng phải sử dụng liên tục và được biết đến là vua của mọi hàm số trong DAX. Đó chính là hàm CALCULATE.Nếu bạn muốn xây dựng các báo cáo động, xử lý các điều kiện lọc phức tạp hay thực hiện các phép tính nâng cao, làm chủ hàm CALCULATE trong Power BI là bước đi bắt buộc.

Bài viết này, Starttrain sẽ giúp bạn hiểu sâu sắc về cú pháp, nguyên lý hoạt động và cách ứng dụng thực tế hàm CALCULATE thông qua các ví dụ trực quan từ một dự án phân tích đơn hàng thực tế.

Hàm CALCULATE trong Power BI là gì?

Hàm CALCULATE trong Power BI là hàm duy nhất trong ngôn ngữ DAX có khả năng thay đổi, điều chỉnh hoặc ghi đè lên ngữ cảnh bộ lọc hiện tại của báo cáo để thực hiện một phép toán cụ thể.Thông thường, khi bạn kéo một giá trị vào biểu đồ, Power BI sẽ tự động tính toán dựa trên các bộ lọc có sẵn trên trang báo cáo (slicer, hàng, cột của bảng).

Tuy nhiên, nếu bạn muốn tính một chỉ số vượt ngoài các bộ lọc tự động đó (ví dụ: tính doanh thu nhưng chỉ áp dụng cho một nhóm sản phẩm nhất định, bất kể người dùng đang chọn slicer nào), bạn bắt buộc phải dùng CALCULATE.

Cú pháp của hàm CALCULATE

Cú pháp chuẩn của hàm CALCULATE trong Power BI như sau:

CALCULATE(Expression, Filter1, Filter2, ...)

Trong đó:

  • Expression (Biểu thức): Là phép tính toán mà bạn muốn thực hiện. Đây có thể là một hàm tổng hợp như SUM, AVERAGE, COUNT, DISTINCTCOUNT hoặc một Measure đã được tạo sẵn từ trước.
  • Filter1, Filter2, … (Bộ lọc): Là một hoặc nhiều điều kiện lọc mà bạn muốn áp dụng vào biểu thức tính toán ở trên. Các bộ lọc này có thể là:
    • Bộ lọc dạng Boolean (ví dụ: SanPham[MauSac] = “Do”).
    • Bộ lọc dạng bảng phức tạp hơn (ví dụ: sử dụng hàm FILTER, ALL, KEEPFILTERS).

Ngữ cảnh sử dụng hàm CALCULATE

Hàm CALCULATE được sử dụng trong các trường hợp chính sau:

  • Ghi đè bộ lọc hiện tại: Thay đổi bộ lọc mà người dùng đang chọn trên Dashboard để tính một chỉ số cố định.
  • Chuyển đổi ngữ cảnh (Context Transition): Chuyển đổi ngữ cảnh dòng (Row Context) thành ngữ cảnh bộ lọc (Filter Context) khi thực hiện các phép tính trong cột tính toán (Calculated Column) hoặc khi lặp qua một bảng bằng các hàm hậu tố X (như SUMX, AVERAGEX).
  • Kết hợp với các hàm Time Intelligence: Tính toán lũy kế từ đầu năm đến nay (YTD), so sánh doanh thu cùng kỳ năm ngoái (Same Period Last Year), …

Cách thức hoạt động và cơ chế chuyển đổi ngữ cảnh

Để thực sự nắm vững CALCULATE trong Power BI, bạn cần hiểu cơ chế vận hành bên dưới của nó qua 3 bước:

  • Đánh giá Filter Context gốc: CALCULATE sẽ nhận diện toàn bộ các bộ lọc đang tác động lên ô tính toán hiện tại, bao gồm Slicer, Filter Pane và tương tác giữa các biểu đồ trên màn hình.
  • Áp dụng các Filter mới: CALCULATE đánh giá các tham số Filter được truyền trực tiếp bên trong nó. Nếu các Filter mới này trùng cột với các Filter gốc, CALCULATE mặc định sẽ ghi đè bộ lọc cũ bằng bộ lọc mới.
  • Tính toán Expression: Sau khi thiết lập xong tập hợp bộ lọc mới, CALCULATE tiến hành chạy biểu thức tính toán trên tập dữ liệu đã được lọc đó và trả về kết quả cuối cùng.

Đặc biệt, CALCULATE còn có khả năng Context Transition. Khi bạn chạy CALCULATE bên trong một môi trường có ngữ cảnh dòng, CALCULATE sẽ lấy toàn bộ giá trị của dòng hiện tại và biến chúng thành các bộ lọc để tính toán dữ liệu.

Minh họa cách sử dụng hàm CALCULATE trong Power BI

Để giúp bạn dễ hình dung cách thức hoạt động của hàm CALCULATE trong Power BI trong thực tế doanh nghiệp, chúng ta sẽ phân tích một ví dụ trực quan dựa trên hệ thống quản lý bán hàng như sau:

Đơn hàng không áp dụng khuyến mãi (Total Orders without Promotions)

Để tính toán số lượng đơn hàng không có khuyến mãi, chúng ta sử dụng hàm CALCULATE kết hợp với DISTINCTCOUNT đơn hàng và lọc điều kiện cột PromotionID là trống (BLANK).

Công thức DAX chi tiết:

Total Orders without Promotions = CALCULATE(DISTINCTCOUNT(OrderHeader[OrderID]), OrderHeader[PromotionID] = BLANK())

hàm Calculate trong Power BI

  • DISTINCTCOUNT(OrderHeader[OrderID]): Biểu thức chính nhằm đếm số lượng ID đơn hàng duy nhất để tránh việc trùng lặp.
  • OrderHeader[PromotionID] = BLANK(): Điều kiện lọc của hàm CALCULATE. Bộ lọc này sẽ lọc toàn bộ bảng OrderHeader để chỉ giữ lại những dòng mà thông tin mã khuyến mãi (PromotionID) không tồn tại (tức là không áp dụng khuyến mãi).

Đơn hàng có áp dụng khuyến mãi (Total Orders with Promotions)

Tương tự, để đếm các đơn hàng có chương trình khuyến mãi, chúng ta đổi điều kiện lọc thành khác rỗng (khác BLANK, ký hiệu là <>).

Công thức DAX chi tiết:

Total Orders with Promotions = CALCULATE(DISTINCTCOUNT(OrderHeader[OrderID]), OrderHeader[PromotionID] <> BLANK())

hàm Calculate trong Power BI
Cơ chế hoạt động tương tự công thức trên, nhưng bộ lọc lúc này chỉ chọn ra các đơn hàng mà cột PromotionID chứa một giá trị khuyến mãi cụ thể (khác rỗng).

Kết quả hiển thị trên Dashboard thực tế:

Khi chúng ta đưa hai chỉ số trên lên màn hình báo cáo bằng các thẻ trực quan (Card) và biểu đồ tròn (Donut Chart), kết quả thu được rất rõ ràng:

  • Tổng số đơn hàng có khuyến mãi (Total Orders with Promotions): 41.430 đơn hàng (chiếm tỷ lệ lớn 92,07%).
  • Tổng số đơn hàng không khuyến mãi (Total Orders without Promotions): 3.570 đơn hàng (chiếm tỷ lệ nhỏ 7,93%).

Biểu đồ tròn trực quan giúp ban giám đốc nhìn ngay ra được hiệu quả phủ sóng cực kỳ mạnh mẽ của các chiến dịch khuyến mãi mà doanh nghiệp đang triển khai.

hàm Calculate trong Power BI

Đơn hàng thành công (Total Successful Orders (none return items))

Để xác định các đơn hàng thành công, chúng ta thực hiện phép đếm trên các dòng không bị đánh dấu trả hàng (Return Flag là trống).Công thức DAX chi tiết:

Total Successful Orders (none return items) = CALCULATE(DISTINCTCOUNT(OrderLine[OrderID]), OrderLine[Return Flag] = BLANK())

hàm Calculate trong Power BI

  • DISTINCTCOUNT(OrderLine[OrderID]): Đếm số lượng ID đơn hàng xuất hiện trong bảng chi tiết đơn hàng (OrderLine).
  • OrderLine[Return Flag] = BLANK(): Bộ lọc chỉ giữ lại những chi tiết dòng đơn hàng chưa từng phát sinh yêu cầu trả hàng.

Đơn hàng có phát sinh trả hàng (Total Orders with Return Items)

Ngược lại, để thống kê rủi ro từ việc trả hàng nhằm cải thiện chất lượng dịch vụ hoặc sản phẩm, chúng ta đếm các đơn hàng có chứa sản phẩm bị hoàn trả.Công thức DAX chi tiết:

Total Orders with Return Items = CALCULATE(DISTINCTCOUNT(OrderLine[OrderID]), OrderLine[Return Flag] <> BLANK())
hàm Calculate trong Power BI
Bộ lọc OrderLine[Return Flag] <> BLANK() lọc ra toàn bộ các dòng chi tiết đơn hàng có ghi nhận mã lỗi hoặc cờ hoàn trả (khác rỗng).

Kết quả hiển thị trên Dashboard thực tế:

Sau khi đưa hai chỉ số này vào một biểu đồ Donut Chart, có thể đánh giá ngay hiệu suất vận hành:

  • Tổng đơn hàng thành công (Total Successful Orders): Có 44.733 đơn hàng không có bất kỳ sản phẩm nào bị trả lại (chiếm tỷ lệ 71,66%).
  • Tổng đơn hàng bị hoàn trả (Total Orders with Return Items): Có 17.688 đơn hàng có phát sinh sản phẩm bị trả lại (chiếm tỷ lệ khá cao 28,34%).

Thông tin này cung cấp một cảnh báo quan trọng cho bộ phận quản lý chuỗi cung ứng hoặc chăm sóc khách hàng để tìm hiểu nguyên nhân tại sao tỷ lệ trả hàng lại lên tới gần 30%.hàm Calculate trong Power BI

Các hàm bổ trợ thường đi kèm với CALCULATE trong Power BI

Để tối ưu hóa sức mạnh của hàm CALCULATE trong Power BI, bạn thường sẽ phải kết hợp nó với một số hàm lọc đặc biệt khác. Dưới đây là những sự kết hợp kinh điển nhất:

CALCULATE và ALL

Hàm ALL giúp xóa bỏ tất cả các bộ lọc đang có trên một bảng hoặc một cột. Khi kết hợp với CALCULATE, nó giúp bạn tính toán các giá trị tổng số để từ đó tính toán tỷ lệ phần trăm đóng góp.

  • Ví dụ: Doanh Thu ALL = CALCULATE(SUM(Sales[DoanhThu]), ALL(Sales))
  • Ứng dụng này giúp bạn dễ dàng tính được phần trăm doanh thu của từng sản phẩm trên tổng doanh thu toàn doanh nghiệp.

CALCULATE và FILTER

Hàm FILTER được sử dụng khi bạn cần thực hiện các phép lọc phức tạp hơn (như lọc dựa trên kết quả của một Measure khác hoặc kết hợp nhiều điều kiện logic bằng các toán tử AND, OR).Ví dụ: Doanh Thu Khach Vip = CALCULATE(SUM(Sales[DoanhThu]), FILTER(KhachHang, [TongDoanhThuKhach] > 10000))

CALCULATE và USERELATIONSHIP

Trong Power BI, giữa hai bảng chỉ có thể tồn tại tối đa một liên kết hoạt động (Active Relationship). Nếu bạn có nhiều liên kết, bạn có thể dùng USERELATIONSHIP trong CALCULATE để tạm thời kích hoạt liên kết ẩn phục vụ cho phép tính của mình.

Ví dụ: Doanh Thu Theo Ngay Giao = CALCULATE(SUM(Sales[DoanhThu]), USERELATIONSHIP(Sales[NgayGiaoHang], Calendar[Date]))

Tổng kết

Hàm CALCULATE trong Power BI không chỉ đơn thuần là một công cụ lọc điều kiện, mà còn đại diện cho tư duy thiết kế báo cáo động hiện đại. Bằng việc làm quen với cú pháp, thấu hiểu nguyên lý chuyển đổi ngữ cảnh và rèn luyện qua các ví dụ thực tế như đếm đơn hàng khuyến mãi hay thống kê tỷ lệ hoàn trả hàng ở trên, bạn sẽ nhanh chóng làm chủ ngôn ngữ DAX và tạo ra những báo cáo phân tích có giá trị thực tiễn cao cho doanh nghiệp của mình.

Nếu muốn hiểu sâu về Filter Context, Row Context, DAX Measure và cách xây dựng Dashboard thực tế từ dữ liệu doanh nghiệp, bạn nên tham gia Khóa học Power BI để được thực hành trực tiếp trên các bộ dữ liệu và dự án phân tích thực tế.

Để lại một bình luận

Form - đọc sách
Form - Single Report Template

Vui lòng liên hệ qua những thông tin bên dưới. Starttrain sẽ phản hồi bạn trong thời gian sớm nhất.

Form Dashboard service