DAX Challenge #001: Easy – Step By Step Guide Sẽ Được Hướng Dẫn Thêm Trong Khóa Học.
Khóa Học Phân Tích Dữ Liệu Với Power BI – Học Power BI Qua 081+ Challenges & Cases Từ Căn Bản Đến Nâng Cao – Inbox Mình TẠI ĐÂY Nếu Bạn Muốn Đăng Ký Khóa Học Này.
Khi Đăng Ký Thành Công Khóa Học, Bạn Sẽ Vừa Được Học Trực Tiếp Qua Google Meet – Vừa Được Cấp Quyền Truy Cập Giải Các Challenges (Gồm: File Dataset & Code)
Bạn Làm Gì Trong Challenge Này?
Bạn có 1 Category Slicer và 1 Title -> 04 trường hợp như sau:
Trường hợp 01: Nếu bạn không chọn gì (= All selected)
┌─────────────────┐
│ [x] Electronics │
│ [x] Fashion │ ───► "■ All Categories"
│ [x] Home │
│ [x] Beauty │
│ [x] Sports │
└─────────────────┘
Trường hợp 02: Chọn 1 category: Electronics
┌─────────────────┐
│ [x] Electronics │
│ [ ] Fashion │ ───► "■ Electronics"
│ [ ] Home │
└─────────────────┘
Trường hợp 03: Chọn 2-3 categories
┌─────────────────┐
│ [x] Electronics │
│ [x] Fashion │ ───► "■ Electronics, Fashion, Home"
│ [x] Home │
└─────────────────┘
Trường hợp 04: Chọn nhiều hơn 3 categories
┌─────────────────┐
│ [x] Electronics │
│ [x] Fashion │ ───► "■ Beauty, Electronics, Fashion
│ [x] Home │ ... và 1 thêm"
│ [x] Beauty │
│ [ ] Sports │
└─────────────────┘

DAX Code
Dynamic Category Title =
VAR FilteredCount = COUNTROWS(VALUES(DimProduct[Category]))
-- VALUES(...) ───► Lấy categories đang được filter
-- COUNTROWS() ───► Đếm có bao nhiêu
-- Example: User chọn Electronics, Fashion ───► FilteredCount = 2
VAR TotalCount = COUNTROWS(ALL(DimProduct[Category]))
-- ALL(...) ───► Lấy TẤT CẢ categories (ignore filter)
-- COUNTROWS() ───► Đếm có bao nhiêu
-- Example: TotalCount = 5 (luôn = 5)
VAR MaxShow = 3 -- Số lượng tối đa categories hiển thị trước "và N thêm"
RETURN
IF(
FilteredCount = TotalCount, -- Kiểm tra: Filtered = Total?
"■ All Categories", -- FilteredCount = 5, TotalCount = 5 ───► TRUE ───► User đang xem ALL ───► Hiển thị "All Categories"
"■ " &
IF(
FilteredCount <= MaxShow, -- Check có <= 3 categories không?
CONCATENATEX(VALUES(DimProduct[Category]), DimProduct[Category], ", "),
-- [YES] FilteredCount <= 3:
-- CONCATENATEX(VALUES(...), ..., ", ") ───► Liệt kê TẤT CẢ categories. Example: "Electronics, Fashion"
CONCATENATEX(
TOPN(MaxShow, VALUES(DimProduct[Category])),
DimProduct[Category],
", "
) & "... và " & (FilteredCount - MaxShow) & " thêm"
-- [NO] FilteredCount > 3:
-- CONCATENATEX( TOPN(3, ...), ..., ", ") & "... và " & (FilteredCount - 3) & " thêm"
-- ───► Chỉ liệt kê 3 đầu + số còn lại. Example: "Beauty, Electronics, Fashion... và 1 thêm"
)
)
Minh Họa Trực Quan
User chọn 04 trên Category Slicer: Electronics, Fashion, Home & Living, Beauty
Step 1: Tính FilteredCount
VALUES(DimProduct[Category]) trong filter context hiện tại:
┌─────────────────────┐
│ Electronics │
│ Fashion │
│ Home & Living │
│ Beauty │
└─────────────────────┘ COUNTROWS() = 4 ───► FilteredCount = 4
Step 2: Tính TotalCount
ALL(DimProduct[Category]) bỏ qua filter:
┌─────────────────────┐
│ Electronics │
│ Fashion │
│ Home & Living │
│ Beauty │
│ Sports │
└─────────────────────┘
COUNTROWS() = 5 ───► TotalCount = 5
Step 3: Check IF #1
FilteredCount = TotalCount ?
4 = 5 ? ───► FALSE ───► Đi vào ELSE branch
Step 4: Check IF #2
FilteredCount <= MaxShow ?
4 <= 3 ? ───► FALSE ───► Cần limit + "và N thêm"
Step 5: TOPN(3, ...) lấy 3 categories đầu
┌─────────────────────┐
│ Beauty │
│ Electronics │
│ Fashion │
└─────────────────────┘
Step 6: CONCATENATEX nối chuỗi
"Beauty" + ", " + "Electronics" + ", " + "Fashion"
= "Beauty, Electronics, Fashion"
Step 7: Tính số còn lại và append
(FilteredCount - MaxShow) = 4 - 3 = 1
"■ " & "Beauty, Electronics, Fashion" & "... và " & 1 & " thêm"
Kết quả: "■ Beauty, Electronics, Fashion... và 1 thêm"
DAX Theory
CONCATENATEX( <table>, <expression>, [<delimiter>], [<orderBy>], [<order>] )
Duyệt qua từng row trong TABLE, evaluate EXPRESSION, và nối thành STRING.
CONCATENATEX(
VALUES(DimProduct[Category]), ◄── Table input
DimProduct[Category], ◄── Expression per row
", " ◄── Delimiter
)
Execution:
──────────
Input Table: Iteration: Output:
┌─────────────┐ ┌─────────────────┐
│ Electronics │ ──Row1──►│ "Electronics" │
│ Fashion │ ──Row2──►│ + ", " + │ "Electronics,
│ │ │ "Fashion" │────► Fashion"
└─────────────┘ └─────────────────┘
-- Thêm prefix/suffix cho mỗi item:
CONCATENATEX(
VALUES(DimProduct[Category]),
"► " & DimProduct[Category] & " ◄",
" | "
)
───► "► Electronics ◄ | ► Fashion ◄"
-- Thêm value cho mỗi item:
CONCATENATEX(
VALUES(DimProduct[Category]),
DimProduct[Category] & " (" & [Total Revenue] & ")",
", "
)
───► "Electronics (150M), Fashion (100M)"
