
DAX Từ Cơ Bản Đến Nâng Cao: CALCULATE, Time Intelligence Và Copilot
Chia sẻ
"Hướng dẫn DAX Power BI toàn diện: từ khái niệm filter context, hàm CALCULATE + ALL/ALLEXCEPT, đến Time Intelligence (YTD, MTD, YoY). Cập nhật TABLEOF/NAMEOF mới nhất và cách dùng Copilot tạo DAX tự động."
DAX (Data Analysis Expressions) là ngôn ngữ công thức của Power BI — và cũng là rào cản lớn nhất khiến nhiều người "bỏ cuộc" khi học Power BI. Lý do? DAX nhìn giống Excel nhưng hoạt động hoàn toàn khác — vì nó dựa trên khái niệm Filter Context (ngữ cảnh lọc).
Trong bài viết này, mình sẽ giải thích rõ Filter Context bằng ví dụ trực quan, hướng dẫn chi tiết hàm CALCULATE (quan trọng nhất DAX), Time Intelligence cho báo cáo tài chính, và cách tận dụng Copilot để viết DAX nhanh hơn.

1. Filter Context — Nền Tảng Của Mọi Công Thức DAX
Filter Context (ngữ cảnh lọc) là khái niệm quan trọng nhất trong DAX. Mỗi ô trong một visual (bảng, biểu đồ) đều có một filter context riêng — quyết định dữ liệu nào được tính toán.
1.1 Row Context vs Filter Context
Row Context xảy ra khi bạn tạo Calculated Column — DAX duyệt từng dòng. Filter Context xảy ra khi bạn tạo Measure — DAX tính toán dựa trên các bộ lọc hiện tại (slicer, filter pane, row/column của matrix).
// Calculated Column (Row Context) — duyệt từng dòng
Profit = Sales[Revenue] - Sales[Cost]
// Measure (Filter Context) — tổng hợp theo ngữ cảnh
Total Revenue = SUM(Sales[Revenue])
// Trong matrix: tự động tính theo từng Product, Region, Month...1.2 Ví dụ trực quan
Giả sử bạn có measure Total Revenue = SUM(Sales[Revenue]). Khi đặt vào Matrix với Rows = Khu Vực, Columns = Tháng:
Ô "Hà Nội + Tháng 3": filter context = Khu vực Hà Nội AND Tháng 3 → SUM chỉ tính doanh thu Hà Nội tháng 3
Ô "Total" dòng: filter context = Tháng 3 (không lọc Khu vực) → SUM tính tất cả khu vực tháng 3
Ô "Grand Total": không có filter → SUM tính toàn bộ
💡 Nhớ: Measure không có giá trị cố định — giá trị thay đổi tùy thuộc vào filter context tại mỗi ô.
2. CALCULATE — Hàm Quan Trọng Nhất Trong DAX
CALCULATE thay đổi filter context của phép tính. Đây là hàm mạnh nhất và được dùng nhiều nhất.
CALCULATE(expression, [filter1], [filter2], ...)
// expression: measure hoặc aggregation cần tính
// filter: điều kiện lọc — THÊM hoặc GHI ĐÈ filter context hiện tại2.1 Ví dụ cơ bản: Lọc một giá trị
// Doanh thu chỉ tính Hà Nội (BẤT KỂ slicer chọn gì)
Revenue HN = CALCULATE(SUM(Sales[Revenue]), Region[Name] = "Hà Nội")
// % Doanh thu Hà Nội so với tổng
% HN = DIVIDE([Revenue HN], [Total Revenue])2.2 CALCULATE + ALL — Bỏ toàn bộ filter
// Tổng doanh thu BỎ QUA mọi filter (Grand Total cố định)
Total Revenue ALL = CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
// % Contribution = Doanh thu item / Tổng (dù filter hay không)
% Contribution = DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)ALL(Sales) bỏ toàn bộ filter trên bảng Sales. Dù slicer chọn "Hà Nội" hay bất kỳ gì, Total Revenue ALL luôn trả về tổng tất cả.
2.3 CALCULATE + ALLEXCEPT — Bỏ filter trừ một cột
// % Doanh thu theo Sản phẩm trong mỗi Khu vực
% Product in Region = DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(SUM(Sales[Revenue]), ALLEXCEPT(Sales, Sales[Region]))
)
// ALLEXCEPT(Sales, Sales[Region]):
// = bỏ filter Product, Month... nhưng GIỮ filter Region
// → tử số = doanh thu 1 sản phẩm tại 1 khu vực
// → mẫu số = doanh thu TẤT CẢ sản phẩm tại khu vực đó2.4 CALCULATE + FILTER — Điều kiện phức tạp
// Doanh thu từ khách hàng VIP (mua trên 100 triệu)
Revenue VIP = CALCULATE(
SUM(Sales[Revenue]),
FILTER(Customer, [Total Revenue] > 100000000)
)
// Lưu ý: FILTER duyệt từng dòng (row context) bên trong3. Time Intelligence — Phân Tích Theo Thời Gian
Time Intelligence là bộ hàm DAX chuyên dụng cho phân tích theo thời gian — cực kỳ quan trọng cho báo cáo tài chính, bán hàng, KPI.
Yêu cầu: Phải có Date Table với cột Date liên tục (không trùng, không thiếu ngày) và đánh dấu là Date Table trong Power BI.
3.1 YTD, MTD, QTD — Lũy kế
// Year-to-Date Revenue
Revenue YTD = TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
// Month-to-Date
Revenue MTD = TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])
// Quarter-to-Date
Revenue QTD = TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])
// YTD với năm tài chính bắt đầu tháng 4
Revenue FY YTD = TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")3.2 YoY — So sánh cùng kỳ năm trước
// Doanh thu cùng kỳ năm trước
Revenue PY = CALCULATE(
SUM(Sales[Revenue]),
SAMEPERIODLASTYEAR(DateTable[Date])
)
// Growth YoY %
YoY Growth = DIVIDE(
SUM(Sales[Revenue]) - [Revenue PY],
[Revenue PY]
)
// Chênh lệch tuyệt đối
YoY Variance = SUM(Sales[Revenue]) - [Revenue PY]3.3 Previous Month / Rolling 12 Months
// Doanh thu tháng trước
Revenue PM = CALCULATE(
SUM(Sales[Revenue]),
PREVIOUSMONTH(DateTable[Date])
)
// MoM Growth %
MoM Growth = DIVIDE([Total Revenue] - [Revenue PM], [Revenue PM])
// Rolling 12 months (12 tháng gần nhất)
Revenue R12M = CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)4. Hàm Mới 2025-2026: TABLEOF, NAMEOF Và Input Slicer
4.1 TABLEOF — Tạo bảng inline
TABLEOF cho phép tạo bảng trực tiếp trong DAX mà không cần Power Query — hữu ích cho bảng lookup nhỏ, mapping, scenario analysis.
// Tạo bảng mapping KPI Targets
KPI Targets = TABLEOF(
"KPI", "Revenue", "Target", 50000000000,
"KPI", "Gross Margin", "Target", 0.4,
"KPI", "Net Margin", "Target", 0.1,
"KPI", "DSO", "Target", 30
)4.2 NAMEOF — Tham chiếu tên cột an toàn
// NAMEOF trả về tên cột dưới dạng text — an toàn khi đổi tên
Column Label = NAMEOF(Sales[Revenue]) // "Revenue"
// Hữu ích trong dynamic titles
Chart Title = "Biểu đồ " & NAMEOF(SELECTEDVALUE(Metrics[Column]))4.3 Input Slicer (GA 2026)
Input Slicer cho phép người dùng nhập giá trị số trực tiếp vào slicer — dùng cho scenario analysis: What-if Revenue tăng 10%? Margin mục tiêu bao nhiêu?
// Tạo measure dùng Input Slicer
What-If Revenue = [Total Revenue] * (1 + SELECTEDVALUE(GrowthRate[Value], 0))5. Copilot Trong Power BI — Tạo DAX Bằng Ngôn Ngữ Tự Nhiên
Từ đầu 2026, Copilot trong Power BI Desktop cho phép viết DAX bằng tiếng Anh/tiếng Việt. Bạn mô tả measure cần tạo, Copilot sinh ra code DAX.
5.1 Cách dùng Copilot tạo DAX
Mở New Measure → click biểu tượng Copilot trên formula bar
Gõ mô tả: "Calculate year over year revenue growth percentage"
Copilot sinh ra DAX → bạn review và Accept
Copilot cũng giải thích từng dòng code nếu bạn yêu cầu
5.2 Mẹo prompt hiệu quả
Mô tả rõ ràng: "Total revenue for current year compared to previous year as percentage" thay vì "YoY growth"
Chỉ rõ table/column: "Sum of Revenue column in Sales table filtered by Region = Hanoi"
Yêu cầu giải thích: "Explain this DAX formula step by step"
Hỏi tối ưu: "Is there a more efficient way to write this measure?"
⚠️ Lưu ý: Copilot là trợ lý, không phải chuyên gia. Luôn review kết quả, đặc biệt với CALCULATE phức tạp — Copilot đôi khi sai filter context.
6. Best Practices Khi Viết DAX
Đặt tên measure rõ ràng: Revenue YTD, % Gross Margin — không viết tắt mập mờ
Tạo Date Table riêng (CALENDARAUTO hoặc Power Query) — ĐỪNG dùng cột Date trong fact table
Format DAX nhiều dòng: mỗi tham số 1 dòng, indent rõ ràng
Tách base measures: Total Revenue, Total Cost trước → rồi mới kết hợp thành Profit, Margin
Dùng DIVIDE() thay vì / để tránh chia cho 0
Dùng VAR để đặt biến tạm trong DAX — tương tự LET trong Excel
Dùng ALL/ALLEXCEPT thay vì FILTER khi có thể — performance tốt hơn
// Best practice: dùng VAR
YoY Growth % =
VAR CurrentYear = SUM(Sales[Revenue])
VAR PrevYear = CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))
RETURN
DIVIDE(CurrentYear - PrevYear, PrevYear)Câu Hỏi Thường Gặp (FAQ)
Cần học DAX bao lâu để thành thạo?
Cơ bản (SUM, CALCULATE, DIVIDE, Time Intelligence cơ bản): 2-4 tuần thực hành. Nâng cao (filter context phức tạp, CALCULATE lồng nhau, dynamic measures): 3-6 tháng làm dự án thực tế. Chìa khóa là hiểu Filter Context — khi đã vững, mọi thứ sẽ dễ hơn nhiều.
Có thể học DAX mà không biết Excel không?
Được, nhưng sẽ khó hơn. DAX mượn cú pháp từ Excel (IF, SUM, FILTER) nên người biết Excel sẽ quen nhanh hơn. Tuy nhiên, khái niệm Filter Context hoàn toàn mới — ngay cả expert Excel cũng cần thời gian thích nghi.
CALCULATE có thể thay thế hoàn toàn FILTER không?
Không hoàn toàn. CALCULATE là nơi bạn thay đổi filter context, còn FILTER là iterator duyệt từng dòng. FILTER thường nằm BÊN TRONG CALCULATE khi cần điều kiện dựa trên measure. Khi bộ lọc đơn giản (1 cột = 1 giá trị), dùng trực tiếp trong CALCULATE mà không cần FILTER.
Copilot có thay thế việc học DAX không?
Chưa. Copilot giúp viết DAX nhanh hơn, nhưng bạn vẫn cần hiểu Filter Context để review, debug và tối ưu code. Copilot đôi khi tạo ra DAX chạy được nhưng sai logic — chỉ người hiểu DAX mới phát hiện được.
Kết Luận
DAX là kỹ năng then chốt để khai thác sức mạnh Power BI. Bắt đầu từ Filter Context → CALCULATE → Time Intelligence — đây là 3 trụ cột. Khi đã vững, thêm TABLEOF/NAMEOF và Copilot sẽ giúp bạn nhanh hơn gấp nhiều lần.
Nếu bạn mới bắt đầu Power BI, đọc thêm bài Dashboard Power BI và Power Query trên Trà Đá Data nhé! 🍵
Bình luận
Đăng nhập để tham gia bình luận
Đăng nhậpNhận bài viết mới nhất
Đăng ký để nhận thông báo khi có bài viết mới. Không spam, chỉ kiến thức chất lượng.
Bài viết liên quan
Khám phá thêm các bài viết cùng chủ đề

