Hiện nay Power BI ngày càng trở nên thịnh hành, chính vì lẽ đó nên việc tìm hiểu các hàm DAX (Data Analysis Expression) ngày càng trở nên quan trọng hơn.
Đơn giản vì nếu bạn không nắm bắt được các hàm DAX thì cũng như bạn sử dụng Excel mà không biết cách sử dụng công thức của nó vậy. Khi đó thì bạn không thể sử dụng Power BI thực sự hiệu quả, cũng như tạo ra được các báo cáo theo mong đợi của mình.
Trong bài viết này mình sẽ tập trung nói về 3 hàm được sử dụng khá nhiều trong Power BI đó là ALL, ALLSELECTED và ALLEXCEPT.
Tuy nhiên đầu tiên ta cần nắm bắt được 2 khái niệm rất quan trọng trong DAX là external filter và internal filter.
- Internal Filter là các Filter nằm ở bên trong Visual của bạn. Ví dụ như Filter tới từ dòng, từ cột, từ các Category trên 1 biểu đồ nào đó của bạn, …
- External Filter là các Filter tới từ bên ngoài Visual của bạn. Ví dụ như từ Slicer, từ việc bạn click chọn 1 đối tượng trên 1 Visual khác, …
Giờ ta sẽ bắt đầu tìm hiểu 3 hàm ALL, ALLSELECTED và ALLEXCEPT nhé.
Trước khi bắt đầu mình sẽ Show trước Relationship của bài này như sau.
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:
Sales Amount = SUMX ( Sales, Sales[Quantity] * Sales[Net Price] )
Và đây là kết quả của chúng ta. 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.
% Of Sales Amount =
VAR SalesAmount = [Sales Amount]
VAR All_SalesAmount =
CALCULATE(
[Sales Amount],
ALL(Sales)
)
VAR Result =
DIVIDE(
SalesAmount,
All_SalesAmount
)
RETURN
Result
Ở đâ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.
% Of Sales Amount (ALLSELECTED) =
VAR SalesAmount = [Sales Amount]
VAR ALLSELECTED_SalesAmount =
CALCULATE(
[Sales Amount],
ALLSELECTED(Sales)
)
VAR Result =
DIVIDE(
SalesAmount,
ALLSELECTED_SalesAmount
)
RETURN
Result
Và đây là kết quả trả về.
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.
% Of Sales Amount (ALLSELECTED) =
VAR SalesAmount = [Sales Amount]
VAR ALLSELECTED_SalesAmount =
CALCULATE(
[Sales Amount],
ALLSELECTED(Sales)
)
VAR Result =
DIVIDE(
SalesAmount,
ALLSELECTED_SalesAmount
)
RETURN
Result
Và đây là kết quả trả về.
vui lòng ủy quyền