DAX là gì?
DAX (Data Analysis Expressions) là ngôn ngữ công thức của Power BI, Power Pivot trong Excel và Analysis Services. Nhìn qua thì giống công thức Excel — cũng SUM, IF, AVERAGE — nhưng có một khác biệt căn bản.
Công thức Excel làm việc trên ô. DAX làm việc trên cột và bảng. Bạn không viết "lấy ô B2 nhân ô C2" mà viết "lấy cột Số lượng nhân cột Đơn giá, rồi cộng lại theo ngữ cảnh mà người xem đang lọc". Chính chữ "theo ngữ cảnh" là thứ khiến DAX vừa mạnh vừa khó.
Cột tính toán hay số đo — chọn cái nào?
Đây là câu hỏi người mới hay sai nhất, và sai thì báo cáo nặng lên trông thấy.
- Cột tính toán (calculated column) tính một lần lúc làm mới dữ liệu, lưu kết quả vào từng dòng, chiếm dung lượng trong mô hình. Dùng khi cần một giá trị cố định theo dòng để lọc hoặc nhóm — ví dụ phân loại đơn hàng thành "Nhỏ / Vừa / Lớn".
- Số đo (measure) tính lúc người xem nhìn báo cáo, không lưu gì, luôn tính theo bộ lọc hiện tại. Dùng cho mọi con số tổng hợp — doanh thu, số đơn, tỷ lệ.
Nguyên tắc thực dụng: mặc định dùng số đo. Chỉ tạo cột tính toán khi bạn cần giá trị đó xuất hiện ở trục, bộ lọc hoặc quan hệ giữa các bảng.
Nhóm 1 — Các hàm tổng hợp
Đây là nhóm dùng nhiều nhất, cú pháp gần Excel nên dễ bắt đầu.
Doanh thu = SUM(BanHang[ThanhTien])
Số đơn = COUNTROWS(BanHang)
Giá trị đơn TB = AVERAGE(BanHang[ThanhTien])
Số khách = DISTINCTCOUNT(BanHang[MaKhach])
Lưu ý DISTINCTCOUNT: đếm giá trị khác nhau, không phải đếm dòng. Đây là hàm hay bị dùng nhầm cho "số khách hàng" khi bảng có nhiều dòng cho một khách.
Nhóm 2 — Bản X: khi cần tính theo từng dòng rồi mới cộng
Mỗi hàm tổng hợp có một bản kết thúc bằng chữ X: SUMX, AVERAGEX, COUNTX. Khác biệt nằm ở chỗ chúng duyệt qua từng dòng, tính biểu thức cho dòng đó, rồi mới tổng hợp.
Doanh thu = SUMX(BanHang, BanHang[SoLuong] * BanHang[DonGia])
Vì sao không viết SUM(BanHang[SoLuong] * BanHang[DonGia])? Vì SUM chỉ nhận một cột, không nhận biểu thức. Khi cần nhân hai cột rồi cộng, bắt buộc dùng SUMX.
Cái bẫy: SUM([SoLuong]) * SUM([DonGia]) chạy được nhưng cho kết quả sai hoàn toàn — nó lấy tổng số lượng nhân tổng đơn giá. Đây là lỗi thường gặp nhất của người mới.
Nhóm 3 — Hàm logic
Xếp loại = IF(BanHang[ThanhTien] > 10000000, "Lớn", "Nhỏ")
Tỷ lệ lãi = DIVIDE([LoiNhuan], [DoanhThu])
DIVIDE là hàm nên dùng thay cho dấu chia. Chia cho 0 bằng dấu / sẽ ra lỗi hiển thị đầy báo cáo; DIVIDE trả về trống, và bạn đặt được giá trị thay thế bằng tham số thứ ba.
Khi có nhiều điều kiện lồng nhau, đừng chồng IF nhiều tầng — dùng SWITCH, dễ đọc hơn hẳn.
Nhóm 4 — Hàm ngữ cảnh lọc
Đây là nhóm phân biệt người biết DAX với người chỉ chép công thức.
CALCULATE— thay đổi bộ lọc đang áp dụng cho một phép tính. Hàm quan trọng nhất của DAX, đủ nội dung cho một bài riêng.FILTER— trả về một bảng đã lọc, thường dùng bên trongCALCULATEkhi điều kiện phức tạp.ALL— bỏ hết bộ lọc, dùng để tính tỷ trọng trên tổng.
Tỷ trọng = DIVIDE([Doanh thu], CALCULATE([Doanh thu], ALL(SanPham)))
Đọc thêm bài chuyên sâu về CALCULATE và filter context, và bài riêng về hàm FILTER.
Nhóm 5 — Hàm thời gian
Nhóm này cần một bảng lịch riêng đã đánh dấu là bảng ngày; thiếu nó thì hàm chạy sai hoặc không chạy.
Doanh thu YTD = TOTALYTD([Doanh thu], Lich[Ngay])
Doanh thu cùng kỳ = CALCULATE([Doanh thu], SAMEPERIODLASTYEAR(Lich[Ngay]))
Chi tiết ở bài time intelligence: YoY, MTD, YTD.
Học DAX theo thứ tự nào
- Hàm tổng hợp cơ bản — đủ làm được báo cáo đầu tiên.
- Bản X, và hiểu vì sao
SUM(a)*SUM(b)sai. DIVIDE,IF,SWITCH.- Ngữ cảnh lọc và
CALCULATE— đây là ngưỡng thật, nên dành thời gian. - Hàm thời gian, sau khi đã dựng bảng lịch đúng.
Lộ trình đầy đủ có ở trang học Power BI cho người mới bắt đầu. Nếu doanh nghiệp cần báo cáo trước khi bạn kịp học tới bước 4, xem chi phí thuê người làm phần nền rồi tự bảo trì về sau.
Sẵn sàng xây dựng dashboard Power BI?
Kết nối với freelancer Power BI đã kiểm duyệt, xem báo cáo nhúng ngay trên trình duyệt và tải file .pbix về sau khi thanh toán.
Đào Ngọc Tú
Tư vấn Power BI cho doanh nghiệp Việt. Viết về dựng mô hình dữ liệu, DAX và kết nối các nguồn dữ liệu phổ biến trong nước.

