081+ Kiếp Nạn DAX Challenges

DAX Challenge #001: Dynamic Title Based on Filter Selection

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)"