1. Giới Thiệu Bài Viết

Khi làm việc với DAX trong Power BI, bạn có thể gặp những tình huống khi mà cùng một công thức DAX nhưng lại cho ra các kết quả rất khác nhau. Nguyên nhân chính nằm ở hai khái niệm cốt lõi: Row ContextFilter Context. Là hai khái niệm chúng ta sẽ cùng tìm hiểu trong bài viết này.

Việc hiểu và phân biệt hai loại Context này không chỉ giúp bạn tránh sai sót khi viết công thức DAX, mà còn giúp tối ưu hiệu suất truy vấnkiểm soát cách dữ liệu hiển thị trong báo cáo Power BI.

Tình huống, có bao giờ:

  • Bạn gặp lỗi khi dùng các hàm như SUMX(), FILTER(), CALCULATE() do không biết cách hàm DAX xử lý từng dòng và tập dữ liệu?
  • Công thức DAX của bạn hoạt động đúng trên một báo cáo nhưng lại sai ở báo cáo khác?
  • Báo cáo Power BI chạy chậm hoặc lag vì phải xử lý quá nhiều dòng và bộ lọc lồng nhau không cần thiết?

Vậy thì bài viết này chính là dành cho bạn. Thế Row Context và Filter Context là gì? Chúng khác nhau thế nào, và tại sao chúng lại quan trọng khi làm việc với BI? Hãy cùng tìm hiểu trong bài viết này!

2. Định nghĩa hai khái niệm

2.1. Row Context là gì?

Row Context hay bối cảnh dòng đề cập đến bối cảnh mà các công thức DAX thực hiện phép tính cho từng dòng dữ liệu một cách riêng biệt. Row Context cho phép công thức DAX thực hiện phép tính dựa trên giá trị cụ thể của mỗi hàng, ví dụ lấy giá của từng sản phẩm trong từng hàng nhân với số lượng sản phẩm của hàng đó.

Ví dụ minh họa về Row Context:

Ta có bảng dữ liệu Sales bao gồm 5 cột cơ bản:

  • OrderDate: Ngày đặt hàng
  • OrderID: Mã đơn hàng
  • ProductID: Mã sản phẩm
  • UnitPrice: Giá trên một sản phẩm
  • Quantity: Số lượng sản phẩm trên 1 đơn hàng

Đề bài: Tính được doanh thu từng đơn hàng theo từng ngày.

Ý tưởng: Để có kết quả mong muốn ta có thể thực hiện phép tính doanh thu bằng cách lấy UnitPrice của sản phẩm nhân với số lượng sản phẩm ở mỗi dòng. Phép tính này chính là một phép tính dùng Row Context.

Công thức DAX để tạo Cột (Calculated Column) này sẽ là:

Revenue = [UnitPrice] * [Quantity]

Kết quả:

Cũng trong ví dụ này, nếu chúng ta muốn xem tổng doanh thu của tất cả đơn hàng thay vì cho từng đơn hàng thì sao? Chúng ta có thể thực hiện việc này bằng cách tạo Measure:

Total Revenue = SUMX(Sales, [UnitPrice]*[Quantity]

Kết quả khi kéo measure Total Revenue vào Card:

Ta thấy trong trường hợp này Measure vẫn cho ra kết quả đúng mà không hề bị lỗi. Đó là bởi vì hàm tính SUMX cũng tính toán dựa trên Row Context tương tự như việc tạo ra Calculated Column, nhưng thay vì trả về kết quả là một cột SUMX sẽ thực hiện thêm một phép tính tổng tất cả các giá trị đã tính và chỉ trả về Tổng doanh thu cho tất cả các đơn hàng.

Kết luận: Hai ví dụ trên đã chứng tỏ Row Context không chỉ xuất hiện khi chúng ta tạo Calculated Column mà còn xuất hiện khi tạo Measures với các hàm iterator (SumX, AverageX, MinX,CountX,…).

2.2. Filter Context là gì?

Filter Context (Bối cảnh bộ lọc) là tập hợp tất cả các bộ lọc được áp dụng vào bảng dữ liệu trước khi công thức DAX được thực thi. Người dùng có thể áp dụng Filter Context thông qua Slicer, Filter Pane, Visual Elements, hoặc sử dụng các hàm DAX như CALCULATE(), ALL(), REMOVEFILTERS().

Ví dụ minh họa Filter Context:

Cùng bộ data như trong ví dụ ở Row Context, tuy nhiên chúng ta sẽ bổ sung thêm trường CatagoryName (tên nhóm sản phẩm) và ProductName (Tên sản phẩm)

Để bài: Tạo ra Bar chart xem doanh thu theo từng sản phẩm và cho phép lọc nhóm sản phẩm thông qua bộ lọc Slicer.

Ta sẽ tận dụng Measure tính tổng Revenue từ phần trước:

Total Revenue = SUMX(Sales, [UnitPrice]*[Quantity]

Khi kéo Cột ProductName vào trường Y-axis, và Total Revenue vào trường X-axis của Bar Chart ta sẽ có kết quả như hình dưới. Chèn thêm Slicer CategoryName vào và chọn Beverages. Kết quả:

Ta có thể thấy, mặc dù measure Total Revenue có DAX dùng bối cảnh tính theo hàng nhưng khi thêm Slicer và chỉnh bộ lọc về Beverages, Filter Context được áp dụng và Card hiển thị Total Revenues đã thay đổi từ tổng doanh số của tất cả orders (là 1,35 triệu) về chỉ còn tổng doanh số của nhóm sản phẩm Beverages (là 286,53 nghìn).

Tương tự khi ta kéo cột ProductName vào Bar Chart thì ProductName này cũng trở thành bộ lọc Filter Context và hàm Total Revenues sẽ áp dụng bộ lọc thêm một lần nữa, trả về kết quả là tổng doanh thu của từng sản phẩm thuộc nhóm sản phẩm Beverages.

3. Phân biệt Row Context và Filter Context

3.1 Bảng so sánh

Sau khi đã tìm hiểu về 2 khái niệm và ví dụ về Row Context và Filter Context, để có thể dễ dàng phân biệt chúng hơn ta hãy cùng tổng hợp lại các điểm chính của từng loại qua bảng so sánh sau:

Đặc điểm Row Context Filter Context
Cách hoạt động Đánh giá công thức cho từng dòng riêng lẻ Áp dụng bộ lọc cho toàn bộ bảng hoặc tập dữ liệu
Xuất hiện Khi dùng Calculated Column hoặc hàm Iterator Khi dùng Measures, Slicer, Filters, Visual
Hàm quan trọng SUMX(), AVERAGEX(), FILTER() CALCULATE(), ALL(), REMOVEFILTERS()
Ảnh hưởng đến dữ liệu Xử lý từng dòng trước, sau đó mới tổng hợp (nếu dùng hàm iterator) Thay đổi tập dữ liệu trước khi thực thi tính toán
Cách thay đổi Context Dùng EARLIER(), RELATED() để lấy dữ liệu dòng khác Dùng CALCULATE() để thay đổi bộ lọc theo ý muốn

3.2 Sự tương tác giữa Row Context và Filter Context:

Filter Context và Row Context hoạt động độc lập với nhau. Tuy nhiên Filter Context có thể ảnh hưởng đến Row Context. Khi một bộ lọc Filter Context được áp dụng, nó xác định phạm vi dữ liệu mà công thức DAX sẽ xử lý. Nếu một công thức đang chạy trong Row Context, nó không tự động kế thừa Filter Context trừ khi có hàm như CALCULATE(), SUMX(),… sẽ giúp áp dụng bộ lọc Filter Context vào từng dòng.

Nói cách khác, Filter Context có thể giới hạn dữ liệu mà Row Context làm việc, nhưng không phải lúc nào cũng “nằm trên” Row Context một cách mặc định. Một số hàm như ALL() hoặc REMOVEFILTERS() có thể xóa bỏ Filter Context, khiến công thức hoạt động trên toàn bộ dữ liệu mà không bị ảnh hưởng bởi bộ lọc cấp báo cáo, ngay cả khi dùng Calculation(), SumX().

4. Kết luận

Trong Power BI, việc hiểu rõ Row Context và Filter Context là điều kiện tiên quyết để viết công thức DAX một cách chính xác và hiệu quả. Row Context hữu ích trong việc xử lý từng dòng dữ liệu riêng lẻ, trong khi Filter Context giúp kiểm soát phạm vi dữ liệu được DAX tính toán.

Hiểu và kết hợp hai loại Context này một cách chính xác trong DAX sẽ giúp bạn có thể dễ dàng giải quyết nhiều bài toán phức tạp hơn, giúp tối ưu hóa hiệu suất báo cáo, cũng như kiểm soát tốt hơn cách dữ liệu được hiển thị trong Power BI!