Time Intelligence trong Power BI: 7 hàm DAX cần biết

Featured Image 1200×628@2x

⏱ CÂU HỎI MỖI NGÀY CỦA DATA ANALYST

“Doanh thu tháng này tăng bao nhiêu so với cùng kỳ năm ngoái?”, “Lũy kế từ đầu năm đến nay đã được bao nhiêu?”. Đây là những câu hỏi Data Analyst nhận được gần như mỗi ngày. Trong Power BI, câu trả lời nằm ở nhóm hàm Time Intelligence của DAX.

Time Intelligence trong Power BI là gì?

Time Intelligence là nhóm hàm DAX giúp bạn tính toán theo thời gian: lũy kế từ đầu tháng, quý, năm; so sánh với cùng kỳ năm trước hay tháng trước; tính trung bình trượt nhiều tháng. Thay vì lọc tay từng giai đoạn, bạn viết một measure và nó tự động đúng cho mọi tháng, quý, năm trên báo cáo.

Điều kiện bắt buộc: một bảng ngày chuẩn

Các hàm Time Intelligence chỉ chạy đúng khi mô hình có bảng ngày (Date table) đáp ứng 3 điều kiện:

① Liên tục

có đủ mọi ngày, không thiếu ngày nào, bao trọn các năm có dữ liệu.

② Duy nhất

mỗi ngày chỉ xuất hiện một lần.

③ Được đánh dấu

vào Table tools › Mark as date table và chọn cột Date.

Bạn có thể tạo nhanh bảng ngày bằng DAX:

Dim_Ngay =
ADDCOLUMNS (
    CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2026, 12, 31 ) ),
    "Nam", YEAR ( [Date] ),
    "Thang", MONTH ( [Date] ),
    "TenThang", FORMAT ( [Date], "MM/yyyy" ),
    "Quy", "Q" & QUARTER ( [Date] )
)

Sau đó nối Dim_Ngay[Date] với cột ngày trong bảng Fact (ví dụ Fact_BanHang[NgayBan]) theo quan hệ 1 – nhiều. Nếu bạn chưa quen với bảng Fact, Dimension, hãy đọc trước bài Star Schema là gì? Cách xây mô hình dữ liệu chuẩn trong Power BI.

Toàn bộ ví dụ bên dưới dùng chung một measure gốc:

Doanh thu = SUM ( Fact_BanHang[ThanhTien] )

💡 Lưu ý: luôn dùng cột ngày của Dim_Ngay trong các hàm Time Intelligence và trên trục biểu đồ, không dùng cột ngày trong bảng Fact.

7 hàm DAX Time Intelligence Data Analyst cần biết

01 LŨY KẾ

1. TOTALYTD: lũy kế từ đầu năm

TOTALYTD cộng dồn giá trị từ ngày đầu năm đến ngày đang xét. Đây là hàm dùng nhiều nhất để theo dõi tiến độ so với kế hoạch năm.

Doanh thu YTD = TOTALYTD ( [Doanh thu], Dim_Ngay[Date] )

Nếu công ty dùng năm tài chính không trùng năm dương lịch (ví dụ kết thúc ngày 30/6), thêm tham số ngày kết thúc năm:

Doanh thu YTD (NTC) = TOTALYTD ( [Doanh thu], Dim_Ngay[Date], "6/30" )

02 LŨY KẾ

2. TOTALMTD và TOTALQTD: lũy kế từ đầu tháng, đầu quý

Cùng nguyên tắc với TOTALYTD nhưng tính từ ngày đầu tháng hoặc đầu quý. Rất hữu ích cho báo cáo theo dõi hàng ngày.

Doanh thu MTD = TOTALMTD ( [Doanh thu], Dim_Ngay[Date] )

Doanh thu QTD = TOTALQTD ( [Doanh thu], Dim_Ngay[Date] )

03 SO SÁNH

3. SAMEPERIODLASTYEAR: so sánh cùng kỳ năm trước

SAMEPERIODLASTYEAR dịch khoảng thời gian đang xét lùi đúng 1 năm. Kết hợp với CALCULATE và DIVIDE, bạn có ngay chỉ số tăng trưởng so với cùng kỳ (YoY):

Doanh thu cùng kỳ =
CALCULATE ( [Doanh thu], SAMEPERIODLASTYEAR ( Dim_Ngay[Date] ) )

Tăng trưởng YoY % =
DIVIDE ( [Doanh thu] - [Doanh thu cùng kỳ], [Doanh thu cùng kỳ] )

Dùng DIVIDE thay cho phép chia “/” để tránh lỗi khi năm trước chưa có dữ liệu (chia cho 0).

04 SO SÁNH

4. DATEADD: dịch linh hoạt theo ngày, tháng, quý, năm

DATEADD cho phép dịch khoảng thời gian theo số đơn vị bạn muốn. Cách dùng phổ biến nhất là so sánh với tháng trước (MoM):

Doanh thu tháng trước =
CALCULATE ( [Doanh thu], DATEADD ( Dim_Ngay[Date], -1, MONTH ) )

Tăng trưởng MoM % =
DIVIDE ( [Doanh thu] - [Doanh thu tháng trước], [Doanh thu tháng trước] )

Thay MONTH bằng DAY, QUARTER hoặc YEAR để đổi đơn vị; DATEADD(Dim_Ngay[Date], -1, YEAR) cho kết quả tương tự SAMEPERIODLASTYEAR.

05 SO SÁNH

5. PARALLELPERIOD: lấy trọn cả giai đoạn trước

Khác với DATEADD, PARALLELPERIOD trả về trọn vẹn tháng, quý hoặc năm trước, bất kể bạn đang xem một ngày hay một tháng. Dùng khi cần hiển thị tổng cả năm trước làm mốc tham chiếu:

Doanh thu cả năm trước =
CALCULATE ( [Doanh thu], PARALLELPERIOD ( Dim_Ngay[Date], -1, YEAR ) )

06 KỲ TRƯỚC

6. PREVIOUSMONTH: doanh thu của tháng liền trước

PREVIOUSMONTH trả về toàn bộ các ngày của tháng trước so với ngày đầu tiên trong bối cảnh hiện tại. Tương tự có PREVIOUSQUARTER, PREVIOUSYEAR, NEXTMONTH…

Doanh thu PM =
CALCULATE ( [Doanh thu], PREVIOUSMONTH ( Dim_Ngay[Date] ) )

07 XU HƯỚNG

7. DATESINPERIOD: tổng và trung bình trượt (rolling)

DATESINPERIOD lấy một khoảng thời gian tính lùi từ một mốc. Đây là cách tính doanh thu 3 tháng hoặc 12 tháng gần nhất, giúp làm mượt biến động theo mùa vụ:

Doanh thu 3 tháng gần nhất =
CALCULATE (
    [Doanh thu],
    DATESINPERIOD ( Dim_Ngay[Date], MAX ( Dim_Ngay[Date] ), -3, MONTH )
)

TB trượt 3 tháng = DIVIDE ( [Doanh thu 3 tháng gần nhất], 3 )

💡 Mẹo: đặt tên measure theo quy ước YTD, MTD, YoY, MoM, Rolling 3M… để cả nhóm dễ hiểu và dễ tìm trong danh sách Fields.

Bảng tổng hợp: câu hỏi nào dùng hàm nào?

Câu hỏi kinh doanh Hàm DAX Ví dụ measure
Lũy kế từ đầu năm đến nay? TOTALYTD Doanh thu YTD
Lũy kế từ đầu tháng, đầu quý? TOTALMTD, TOTALQTD Doanh thu MTD, QTD
Tăng bao nhiêu so với cùng kỳ năm ngoái? SAMEPERIODLASTYEAR Tăng trưởng YoY %
Tăng bao nhiêu so với tháng trước? DATEADD Tăng trưởng MoM %
Tổng cả năm trước là bao nhiêu? PARALLELPERIOD Doanh thu cả năm trước
Tháng trước đạt bao nhiêu? PREVIOUSMONTH Doanh thu PM
Xu hướng 3 tháng, 12 tháng gần nhất? DATESINPERIOD TB trượt 3 tháng

Những lỗi thường gặp khi dùng Time Intelligence

  • Không có bảng ngày riêng hoặc chưa Mark as date table: các hàm trả về trống hoặc sai.
  • Bảng ngày bị thiếu ngày: tạo bảng ngày từ cột ngày của bảng Fact khiến những ngày không có giao dịch bị mất. Hãy dùng CALENDAR hoặc CALENDARAUTO.
  • Dùng cột ngày của bảng Fact trên biểu đồ: bộ lọc không truyền đúng, số cùng kỳ bị lệch.
  • So sánh tháng hiện tại chưa kết thúc với cả tháng trước: tăng trưởng hiển thị âm dù kinh doanh vẫn tốt. Nên giới hạn so sánh đến ngày có dữ liệu mới nhất.
  • Dùng phép chia “/” thay vì DIVIDE: báo cáo hiện lỗi Infinity hoặc NaN khi mẫu số bằng 0.
  • Nhầm DATEADD với PARALLELPERIOD: DATEADD dịch đúng khoảng đang xem, PARALLELPERIOD lấy trọn cả giai đoạn.

📅 Muốn luyện DAX với dữ liệu thực tế cùng giảng viên? Xem Lịch khai giảng tháng 10/2026 các khóa Power BI, SQL, Python, AI tại MCNA.

Câu hỏi thường gặp (FAQ)

Vì sao measure Time Intelligence của tôi trả về trống?

Thường do chưa có bảng ngày chuẩn, chưa Mark as date table, hoặc trên biểu đồ đang dùng cột ngày của bảng Fact thay vì Dim_Ngay.

SAMEPERIODLASTYEAR và DATEADD khác nhau thế nào?

SAMEPERIODLASTYEAR chỉ lùi đúng 1 năm. DATEADD linh hoạt hơn, lùi hoặc tiến theo số ngày, tháng, quý, năm tùy ý.

Có tính được lũy kế theo năm tài chính không?

Có. Thêm tham số ngày kết thúc năm vào TOTALYTD, ví dụ “6/30” cho năm tài chính kết thúc ngày 30/6.

Có cần học hết các hàm Time Intelligence không?

Không cần. Nắm vững 7 hàm trong bài cùng CALCULATE và DIVIDE là đủ cho phần lớn báo cáo kinh doanh.

Kết luận

Time Intelligence giúp báo cáo Power BI trả lời những câu hỏi quan trọng nhất của ban lãnh đạo: đã đạt bao nhiêu, tăng hay giảm so với trước, xu hướng đang đi về đâu. Chỉ cần một bảng ngày chuẩn và 7 hàm DAX trong bài, bạn đã có thể xây bộ chỉ số YTD, MTD, YoY, MoM và trung bình trượt cho bất kỳ báo cáo nào. Hãy mở file Power BI của bạn và thử viết measure Doanh thu YTD ngay hôm nay.

Nếu bạn muốn học DAX bài bản từ nền tảng đến nâng cao và xây dashboard thực tế, khóa học Power BI tại MCNA Technology School sẽ đồng hành cùng bạn.

👉 Xem lịch khai giảng tháng 10/2026: Power BI, SQL, Python, AI – MCNA

Thông tin tác giả

Võ Ngọc Vương – Data Analyst tại MCNA Technology School

MCNA Technology School – Đơn vị tiên phong đào tạo AI, Big Data, Business Intelligence tại Việt Nam. Chuyên sâu về Power BI, Python, SQL và Data Analytics — đối tác đào tạo của 300+ doanh nghiệp.

Đối tác đào tạo: Viettel Global, Masan Group, Techcombank, VPBank, Daikin.

→ Chỉ mục