MinAI - Về trang chủ
Hướng dẫn
9/1345 phút
Đang tải...

DAX Fundamentals

Học DAX trong Power BI - Measures, calculated columns, filter context, và time intelligence

0

🎯 Mục tiêu bài học

TB5 min

Sau bài học này, bạn sẽ:

✅ Hiểu Measures vs Calculated Columns

✅ Filter Context — khái niệm quan trọng nhất của DAX

✅ CALCULATE, ALL, FILTER — core functions

✅ Common DAX patterns: KPIs, Ranking, Running Total

✅ Time Intelligence: YoY, YTD, MTD, Moving Average

Thời gian: 45 phút | Độ khó: Intermediate-Advanced | Tool: Power BI Desktop

1

📖 Bảng Thuật Ngữ Quan Trọng

TB5 min
Thuật ngữTiếng ViệtMô tả
DAXData Analysis ExpressionsFormula language của Power BI
MeasurePhép đoAggregation tính at runtime
Calculated ColumnCột tính toánRow-by-row, stored in model
Filter ContextNgữ cảnh lọcTất cả filters active cho 1 cell
CALCULATEHàm CALCULATEThay đổi filter context
ALLHàm ALLRemove filters từ table/column
FILTERHàm FILTERRow-by-row filter table
Time IntelligenceTính toán thời gianYoY, YTD, MTD, Moving Average
RANKXHàm xếp hạngRank theo measure
SWITCHHàm chuyển đổiClean alternative cho nested IFs

Checkpoint

Measure = runtime aggregation. Filter Context = all active filters cho 1 cell. CALCULATE = thay đổi context. ALL = remove filters. Đây là 4 pillars của DAX!

2

📐 1. DAX Basics

TB5 min

1.1 Measures vs Calculated Columns

MeasureCalculated Column
Tính khi nàoRuntime (mỗi khi viz đổi)Load time (1 lần)
StoredKhông lưu trong dataLưu trong bảng
Context awareThay đổi theo filterCố định per row
Use caseAggregations, KPIsRow-level classification
PerformanceBetter cho aggregationsBetter cho row lookups

1.2 Tạo Measure

dax
1// New Measure (Modeling → New Measure)
2Total Sales = SUM(Sales[Amount])

1.3 Tạo Calculated Column

dax
1// New Column (Modeling → New Column)
2Profit Margin = Sales[Profit] / Sales[Revenue]
3
4Customer Segment =
5 IF(Customer[TotalSpend] > 10000000, "VIP",
6 IF(Customer[TotalSpend] > 5000000, "Premium",
7 IF(Customer[TotalSpend] > 1000000, "Standard", "Basic")))

Rule of thumb: Nếu cần aggregate → dùng Measure. Nếu cần classify row → dùng Calculated Column. 90% trường hợp nên dùng Measure!

Checkpoint

Measure = runtime + context-aware (dùng 90%). Calc Column = load time + fixed per row (classify). Tạo: Modeling → New Measure / New Column!

3

🔍 2. Filter Context

TB5 min

2.1 Hiểu Filter Context

Ví dụ
12025 2026 Total
2Electronics 50M 60M 110M ← filter: Category=Electronics
3Furniture 30M 35M 65M ← filter: Category=Furniture
4Total 80M 95M 175M ← no category filter

Mỗi cell có filter context khác nhau.

2.2 CALCULATE

dax
1CALCULATE(expression, filter1, filter2, ...)
2
3// Electronics Sales (always)
4Electronics Sales =
5 CALCULATE(SUM(Sales[Amount]), Products[Category] = "Electronics")
6
7// Last Year Sales
8Last Year Sales =
9 CALCULATE(SUM(Sales[Amount]), DATEADD(DateTable[Date], -1, YEAR))

2.3 ALL — Remove Filters

dax
1// % of Grand Total
2% of Total =
3 DIVIDE(
4 SUM(Sales[Amount]),
5 CALCULATE(SUM(Sales[Amount]), ALL(Sales))
6 )

2.4 FILTER

dax
1// VIP Sales only
2VIP Sales =
3 CALCULATE(
4 SUM(Sales[Amount]),
5 FILTER(Customer, Customer[Segment] = "VIP")
6 )
7
8// Large Orders
9Large Orders =
10 CALCULATE(COUNTROWS(Sales), FILTER(Sales, Sales[Amount] > 1000000))

CALCULATE là hàm quan trọng nhất trong DAX! Nó thay đổi filter context. Không hiểu CALCULATE = không hiểu DAX. Dành thời gian practice nhiều!

Checkpoint

Filter Context = tất cả filters active. CALCULATE = thay đổi context. ALL = remove filters (cho % of total). FILTER = row-by-row filtering. CALCULATE = #1 function in DAX!

4

📊 3. Common DAX Patterns

TB5 min

3.1 Basic KPIs

dax
1Total Revenue = SUM(Sales[Revenue])
2Total Profit = SUM(Sales[Profit])
3Profit Margin = DIVIDE([Total Profit], [Total Revenue], 0)
4Order Count = COUNTROWS(Sales)
5AOV = DIVIDE([Total Revenue], [Order Count], 0)
6Customer Count = DISTINCTCOUNT(Sales[CustomerID])

3.2 Ranking

dax
1Product Rank =
2 RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC, Dense)
3
4IsTopN = IF([Product Rank] <= 10, "Top 10", "Others")

3.3 Running Total

dax
1Cumulative Sales =
2 CALCULATE(
3 [Total Revenue],
4 FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))
5 )

3.4 Conditional Formatting

dax
1Revenue Color =
2 IF([Revenue Growth %] >= 0.10, "#34a853",
3 IF([Revenue Growth %] >= 0, "#fbbc04", "#ea4335"))

Checkpoint

KPI measures: SUM, COUNTROWS, DISTINCTCOUNT, DIVIDE. RANKX = rank across table. Running Total = CALCULATE + FILTER(ALL(Date)). Luôn dùng DIVIDE thay vì /!

5

⏱️ 4. Time Intelligence

TB5 min

4.1 Date Table (Prerequisite)

dax
1DateTable =
2 ADDCOLUMNS(
3 CALENDARAUTO(),
4 "Year", YEAR([Date]),
5 "Month", MONTH([Date]),
6 "MonthName", FORMAT([Date], "MMM"),
7 "Quarter", "Q" & FORMAT([Date], "Q")
8 )

4.2 Year-over-Year

dax
1PY Sales = CALCULATE([Total Revenue], DATEADD(DateTable[Date], -1, YEAR))
2
3YoY Growth = DIVIDE([Total Revenue] - [PY Sales], [PY Sales], 0)

4.3 YTD / MTD / QTD

dax
1YTD Revenue = CALCULATE([Total Revenue], DATESYTD(DateTable[Date]))
2MTD Revenue = CALCULATE([Total Revenue], DATESMTD(DateTable[Date]))
3QTD Revenue = CALCULATE([Total Revenue], DATESQTD(DateTable[Date]))

4.4 Previous Period & Moving Average

dax
1PM Revenue = CALCULATE([Total Revenue], DATEADD(DateTable[Date], -1, MONTH))
2
3SPLY Revenue = CALCULATE([Total Revenue], SAMEPERIODLASTYEAR(DateTable[Date]))
4
5MA3 Revenue =
6 AVERAGEX(
7 DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
8 [Total Revenue]
9 )

Time Intelligence yêu cầu Date Table — continuous dates, no gaps. Dùng CALENDARAUTO() hoặc CALENDAR(start, end) để tạo. Mark as Date Table trong Modeling tab!

Checkpoint

Date Table = prerequisite (continuous dates). YoY = DATEADD(-1, YEAR). YTD = DATESYTD. MTD = DATESMTD. SAMEPERIODLASTYEAR = same period last year. Moving Average = AVERAGEX + DATESINPERIOD!

6

🔄 5. SWITCH Pattern

TB5 min
dax
1// Clean alternative to nested IFs
2Month Sort =
3 SWITCH([MonthName],
4 "Jan", 1, "Feb", 2, "Mar", 3, "Apr", 4,
5 "May", 5, "Jun", 6, "Jul", 7, "Aug", 8,
6 "Sep", 9, "Oct", 10, "Nov", 11, "Dec", 12, 0)
7
8// Dynamic measure selection
9Selected Measure =
10 SWITCH(
11 SELECTEDVALUE(MetricSelector[Metric]),
12 "Revenue", [Total Revenue],
13 "Profit", [Total Profit],
14 "Orders", [Order Count],
15 [Total Revenue]
16 )

SWITCH thay thế nested IF/ELSEIF — clean hơn, dễ đọc hơn, dễ maintain hơn. Dùng SWITCH(TRUE(), ...) cho complex conditions!

Checkpoint

SWITCH = clean nested IFs. SWITCH(TRUE(), ...) cho complex conditions. SELECTEDVALUE + SWITCH = dynamic measure selector cho dashboard interactivity!

7

📋 Tổng kết

TB5 min

Kiến thức đã học

Chủ đềNội dung chínhTầm quan trọng
BasicsMeasures vs Calc ColumnsFoundation
Filter ContextCALCULATE, ALL, FILTERCore — #1 concept
PatternsKPIs, Ranking, Running TotalPractical
Time IntelligenceYoY, YTD, MTD, Moving AvgBusiness critical
SWITCHClean conditional logicCode quality

5 DAX Rules:

  1. Measures cho aggregations, Columns cho row classification
  2. Filter Context — hiểu context là hiểu DAX
  3. CALCULATE — function quan trọng nhất
  4. ALL — remove filters, FILTER — thêm filters
  5. Time Intelligence — YoY, MTD, YTD, moving averages

Câu hỏi tự kiểm tra

  1. Measures và Calculated Columns khác nhau thế nào?
  2. Filter Context trong DAX là gì?
  3. CALCULATE là function quan trọng nhất vì sao?
  4. Time Intelligence cần Date Table được setup thế nào?

Bài tiếp theo: Power BI Visualizations — Custom visuals và formatting trong Power BI!

🎉 Tuyệt với! Bạn đã nắm vững DAX fundamentals!

Nhớ: Hiểu Filter Context = hiểu DAX. CALCULATE là chìa khóa để mở mọi cánh cửa!