FILTER trả về bảng, không trả về số
Đây là điều cần nắm trước tiên và cũng là nguồn gốc mọi nhầm lẫn quanh hàm này. FILTER nhận một bảng, duyệt từng dòng, giữ lại những dòng thoả điều kiện, rồi trả về một bảng mới.
FILTER(<bảng>, <điều kiện>)
Vì trả về bảng nên bạn không thể đặt FILTER làm số đo. Viết Doanh thu lớn = FILTER(BanHang, BanHang[ThanhTien] > 10000000) sẽ báo lỗi ngay. Nó gần như luôn được dùng bên trong một hàm khác — thường là CALCULATE hoặc COUNTROWS.
Dùng đúng cách
Doanh thu đơn lớn =
CALCULATE(
[Doanh thu],
FILTER(BanHang, BanHang[ThanhTien] > 10000000)
)
Số đơn lớn = COUNTROWS(FILTER(BanHang, BanHang[ThanhTien] > 10000000))
Khi nào cần FILTER, khi nào không
CALCULATE nhận điều kiện đơn giản trực tiếp, không cần bọc FILTER:
-- Đủ rồi, không cần FILTER
Doanh thu Hà Nội = CALCULATE([Doanh thu], KhachHang[TinhThanh] = "Hà Nội")
Chỉ cần FILTER khi điều kiện vượt quá dạng "cột bằng giá trị":
- So sánh hai cột với nhau:
FILTER(BanHang, BanHang[ThanhTien] > BanHang[ChiPhi]) - So với một số đo:
FILTER(SanPham, [Doanh thu] > 50000000) - Điều kiện phức hợp nhiều vế cần logic riêng.
Nguyên tắc: điều kiện đơn giản thì đừng bọc FILTER. Bọc thừa làm chậm và không thêm giá trị gì.
Lọc bảng nhỏ, đừng lọc bảng lớn
Đây là điểm ảnh hưởng tốc độ nhiều nhất. FILTER duyệt từng dòng, nên duyệt bảng giao dịch mười triệu dòng khác hẳn duyệt bảng danh mục một nghìn dòng.
-- Chậm: duyệt toàn bộ bảng bán hàng
CALCULATE([Doanh thu], FILTER(BanHang, RELATED(SanPham[Nhom]) = "Điện tử"))
-- Nhanh: duyệt bảng danh mục sản phẩm rồi để quan hệ lan bộ lọc xuống
CALCULATE([Doanh thu], FILTER(SanPham, SanPham[Nhom] = "Điện tử"))
Hai công thức cho cùng kết quả nhưng thời gian chạy chênh nhau rất xa khi dữ liệu lớn. Quy tắc: lọc ở bảng chiều (danh mục, khách hàng, thời gian), để quan hệ tự lan xuống bảng giao dịch.
FILTER cộng dồn với bộ lọc đang có, không thay thế
FILTER đặt trong CALCULATE sẽ giao với ngữ cảnh hiện tại. Nếu người xem đang lọc năm 2025 và bạn thêm điều kiện đơn trên 10 triệu, kết quả là "đơn trên 10 triệu trong năm 2025" — không phải toàn bộ lịch sử.
Muốn bỏ bộ lọc đang có rồi mới lọc theo ý mình, phải kết hợp ALL:
CALCULATE(
[Doanh thu],
FILTER(ALL(BanHang), BanHang[ThanhTien] > 10000000)
)
Khác biệt giữa hai cách viết này là chỗ nhiều báo cáo ra số không khớp với kỳ vọng mà không ai tìm ra nguyên nhân.
Ba lỗi hay gặp
- Đặt FILTER làm số đo — báo lỗi kiểu dữ liệu. Nhớ nó trả về bảng.
- Bọc FILTER cho điều kiện đơn giản — chạy chậm không cần thiết.
- Dùng FILTER thay cho quan hệ — nếu hai bảng đã có quan hệ, hãy để quan hệ làm việc thay vì lọc thủ công.
Muốn xem công thức của mình chạy mất bao lâu, dùng công cụ trong bài DAX Studio. Tổng quan các nhóm hàm ở bài các hàm DAX cơ bản.
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.

