
Trong Power BI, để hiểu đúng và vận dụng hiệu quả các hàm như ALL, ALLSELECTED, hay ALLEXCEPT, trước hết chúng ta cần nắm vững hai khái niệm rất quan trọng trong DAX: External Filter và Internal Filter.
- Internal Filter là các bộ lọc được tạo ra bên trong trực tiếp Visual. Ví dụ, các giá trị từ dòng (row), cột (column) hay các danh mục (category) trên biểu đồ sẽ tự động sinh ra những bộ lọc này.
- External Filter là các bộ lọc đến từ bên ngoài Visual. Chúng có thể xuất phát từ các thành phần như Slicer, hoặc từ việc bạn tương tác chọn (click) vào một đối tượng trong một Visual khác.
Việc phân biệt rõ Internal Filter và External Filter là nền tảng cần thiết trước khi đi sâu vào cách hoạt động và ứng dụng của các hàm ALL, ALLSELECTED, và ALLEXCEPT.
Trước khi đi vào chi tiết từng hàm, mình sẽ giới thiệu trước mô hình Relationship (sơ đồ mối quan hệ dữ liệu) mà bài viết này sẽ sử dụng để minh họa các ví dụ.
1. Hàm ALL
Cú pháp: =ALL ([<TableNameOrColumnName>] [, <ColumnName> [, <ColumnName> [, …]]]
Hàm ALL trả về tất cả các hàng trong 1 bảng hoặc tất cả các giá trị trong 1 cột, bỏ qua mọi bộ lọc có thể đã được áp dụng.
Nói cơ bản về hàm ALL thì hàm ALL thường được sử dụng như 1 Modifier của hàm CALCULATE.
Nhiệm vụ của hàm ALL cũng khá rõ ràng đó là bạn lấy ra toàn bộ các dòng dữ liệu từ 1 bảng nào đó mà bạn muốn. Mà đương nhiên lấy ra “ALL” có nghĩa là bạn sẽ bỏ qua toàn bộ các Internal và External Filter rồi.
Ví dụ:
Đầu tiên mình sẽ viết 1 Measure có tên Sales Amount để tính toán ra doanh số như sau:
Và đây là kết quả trả về
Bạn có thể thấy bằng Measure Sales Amount ở trên thì ta đã tính toán được Sales Amount cho từng Category.
Giờ ta có 1 bài toán như thế này. Trưởng bộ phận của mình muốn tính ra doanh thu của mỗi Category chiếm bao nhiêu % tổng doanh thu.
Để làm được điều đó thì bạn đã có Measure Sales Amount để lấy ra doanh số theo từng Category sẵn có.
Giờ bạn cần lấy ra Grand Total cho từng dòng nữa là được.
Về cơ bản để lấy ra được Grand Total thì bạn sẽ cần bỏ hết Filter Context đang có đi là được đúng không nào?
Vậy giờ giả sử như dòng Audio đang chịu những Filter Context nào?
Đơn giản đó là Category = “Audio”
Giờ ta sẽ viết 1 hàm lấy ra Total Amount như sau.
Ở đây ta sử dụng hàm CALCULATE với Expression chính là Measure [Sales Amount] mà chúng ta đã viết từ trước.
ALL(Sales) đóng vai trò là CALCULATE Modifier với nhiệm vụ bỏ hết Filter Context trên bảng Sales.
Vậy tại sao ở đây ta bỏ Filter Context trên bảng Sales thì Filter Context trên cột Category của bảng Product cũng bị bỏ đi?
Nhắc đến đây ta cần phải xem lại Data Model của chúng ta.
Bảng Sales và bảng Product đang trong mối quan hệ Many to One.
Có nghĩa là khi bảng Product Filter theo Category = “Audio” thì theo mối quan hệ giữa bảng Product và bảng Sales thì bảng Sales cũng sẽ bị Filter theo điều kiện này.
Điều này cũng có nghĩa là nếu bạn bỏ Filter trên bảng Sales thì bảng Product cũng sẽ bị bỏ hết Filter đi vậy. Lý do chính xác là do mối quan hệ giữa bảng Product và bảng Sales.
Như vậy bằng cách viết như trên ta thu được kết quả như sau.
Đến đây chắc các bạn cũng đã nắm được ứng dụng của hàm ALL rồi đúng không?
Hãy nhớ hàm ALL đơn giản là bỏ tất cả các Filter Context, tính cả Internal và External Filter trên Data Model của bạn.
2. Hàm ALLSELECTED
Ở phần trước của bài viết bạn đã học được cách sử dụng hàm ALL để bỏ qua các Filter Context tới từ bên trong (Internal Filter) và bên ngoài (External Filter).
Vậy giờ ta sẽ tiếp tục nói tới hàm ALLSELECTED.
Cú pháp: =ALLSELECTED([<tableName> | <columnName> [, <columnName> [, <columnName> [,]]]])
Hàm ALLSELECTED trả về tất cả các hàng trong 1 bảng hoặc tất cả các giá trị trong 1 cột, bỏ qua các Filter Context ở bên trong (như dòng, cột, …) và giữ lại các Filter tới từ bên ngoài (Slicer, …)
Giờ để nói rõ hơn về tác dụng của hàm ALLSELECTED thì ta sẽ thử chọn 1 số tiêu chí trên 2 Slicer Calendar Year và Brand như sau.
Bạn có thể thấy là lúc này công thức % Of Sales Amount đã không còn chuẩn xác nữa. Lý do ở đây đó là vì ALL đã bỏ qua tất cả các Filter bên trong và bên ngoài của bảng trên nên kết quả 5.38% ở dòng Category = “Computers” được tính bằng cách lấy Sales Amount tương ứng với Brand = “Adventure Works” và Calendar Year IN {“CY 2007”, “CY 2008”, “CY 2009”}
Giờ yêu cầu đề bài đó là ta cần phải hiện được doanh số của các Category tương ứng trên ảnh đó là Computers, Home Appliances và TV and Video chiếm bao % trên các giá trị đang được lựa chọn (SELECTED)
Đó là lúc mà ta cần phải sử dụng hàm ALLSELECTED.
Và đây là kết quả trả về.
Bạn có thể thấy đó là thay về tính % Sales Amount trên tất cả các Category thì giờ với ALLSELECTED bạn có thể tính được % Sales Amount dựa trên các Category được lựa chọn mà thôi.
please authorize