2026-08-07 · Power BI & Dashboard
Bạn mở Power BI, cần thêm một cột "Thành tiền" vào bảng bán hàng. Có hai nút trông na ná nhau: New column và New measure. Bạn chọn đại New column, gõ công thức, ra số đúng. Mọi thứ có vẻ ổn.
Vài tuần sau file phình lên vài trăm MB, mở mất hai phút, và cái tỷ lệ lãi gộp trên báo cáo thì sai — sai một cách khó chịu vì nhìn qua vẫn hợp lý. Gốc rễ gần như luôn nằm ở một chỗ: chọn nhầm giữa measure và calculated column.
Đây là ngã rẽ đầu tiên của mọi người khi bắt đầu học DAX, và cũng là chỗ dễ đi sai nhất vì cả hai đều "chạy được". Bài này đội ngũ EzTech tách bạch hai khái niệm bằng đúng cách chúng hoạt động bên trong, kèm quy tắc chọn nhanh và ba lỗi hay gặp nhất.
Khác nhau ở đâu: thời điểm tính và thứ được nhìn thấy
Bỏ qua định nghĩa sách vở, chỉ cần nhớ hai điều.
Calculated column tính một lần, lúc refresh. Power BI chạy công thức cho từng dòng, ra kết quả, rồi cất kết quả đó vào file. Sau đó nó nằm im như một cột dữ liệu bình thường. Bạn kéo được nó vào slicer, vào trục biểu đồ, vào cột của bảng.
Measure tính lúc bạn nhìn. Không có gì được lưu sẵn. Mỗi lần bạn bấm một slicer, đổi tháng, click vào một cột trên biểu đồ, Power BI tính lại measure ngay tại thời điểm đó, theo đúng những gì đang được lọc. Đổi lại, measure không kéo vào slicer hay trục được — vì nó không phải là dữ liệu, nó là một phép tính.
Sự khác biệt này kéo theo một hệ quả kỹ thuật quan trọng: calculated column có row context, measure thì không. Nói dễ hiểu, khi viết column, Power BI biết "đang đứng ở dòng nào" nên bạn gõ thẳng [DonGia] * [SoLuong] là chạy. Viết y hệt như vậy trong một measure sẽ báo lỗi, vì measure không đứng ở dòng nào cả — nó nhìn cả một tập dòng.
Muốn nhân theo từng dòng rồi cộng lại trong measure, bạn cần một hàm biết duyệt dòng, ví dụ SUMX. Đó là lý do rất nhiều người mới bị chặn ngay tại đây rồi quay sang tạo calculated column cho nhanh — và đó chính là bước đi sai.
Quy tắc chọn trong 10 giây
Trước khi gõ công thức, hỏi đúng một câu: thứ này sẽ nằm ở đâu trên báo cáo?
| Bạn cần… | Dùng | Vì sao |
|---|---|---|
| Một mục để lọc, để nhóm, để làm trục biểu đồ | Calculated column | Slicer và trục chỉ nhận dữ liệu, không nhận phép tính |
| Một con số tổng hợp thay đổi theo bộ lọc | Measure | Phải tính lại theo ngữ cảnh người xem đang chọn |
| Phân loại từng dòng theo điều kiện (nhóm tuổi nợ, xếp hạng khách) | Calculated column | Là thuộc tính của dòng, cần đem đi lọc |
| Tỷ lệ, tỷ trọng, tăng trưởng, chênh lệch | Measure | Tỷ lệ phải tính trên tổng, không tính trên từng dòng rồi bình quân |
| Một cột cố định, không phụ thuộc bộ lọc (Thành tiền, Tháng, Quý) | Power Query | Nén tốt hơn DAX, mô hình gọn hơn — xem giải thích bên dưới |
Quy tắc rút gọn hơn nữa: nếu bạn định kéo nó vào slicer hoặc trục, đó là column. Còn lại, mặc định là measure. Khi phân vân, hãy chọn measure — nó không làm nặng file, và nếu chọn sai bạn xóa đi rất nhẹ nhàng.
Vì sao thừa calculated column lại làm file phình to
Power BI nén dữ liệu theo cột. Một cột càng ít giá trị khác nhau thì nén càng tốt: cột "Miền" chỉ có ba giá trị gần như không tốn gì. Ngược lại, cột "Thành tiền" trên bảng bán hàng vài triệu dòng có thể có hàng triệu giá trị khác nhau — gần như không nén được, và nó nằm trong file mãi mãi.
Measure thì ngược lại: không chiếm một byte dung lượng nào, chỉ tốn CPU đúng lúc chạy.
Có một lựa chọn thứ ba mà nhiều người quên: tạo cột đó ở tầng Power Query thay vì DAX. Cột sinh ra từ Power Query đi qua đúng cơ chế nén khi nạp vào mô hình, nên thường gọn hơn calculated column làm cùng việc. Nguyên tắc quen thuộc trong nghề là: cái gì cố định, không phụ thuộc vào bộ lọc người xem, hãy làm càng sớm càng tốt trong chuỗi xử lý. Nếu chưa quen tầng này, bạn có thể xem trước Power Query cho kế toán để hình dung việc gì nên đẩy về đó.
Ba lỗi hay gặp nhất
1. Tính tỷ lệ bằng calculated column rồi lấy bình quân
Đây là lỗi nguy hiểm nhất, vì nó không báo lỗi mà chỉ ra số sai.
Giả sử bạn tạo một cột "Tỷ lệ lãi gộp" cho từng dòng hóa đơn, rồi kéo lên báo cáo. Power BI mặc định gộp cột số bằng SUM, bạn đổi sang Average cho hợp lý. Kết quả là bình quân của các tỷ lệ — hoàn toàn khác với tỷ lệ của tổng.
Một hóa đơn 10.000 đồng lãi 50% và một hóa đơn 1 tỷ đồng lãi 10% cho ra bình quân 30%, trong khi tỷ lệ thật của cả hai gộp lại xấp xỉ 10%. Càng nhiều hóa đơn nhỏ lẻ, con số càng lệch, và nó lệch theo hướng đẹp lên nên rất ít ai nghi ngờ.
Cách đúng: tính tổng lãi gộp và tổng doanh thu bằng hai measure, rồi chia hai measure đó cho nhau bằng DIVIDE. Mọi chỉ tiêu dạng tỷ lệ trong báo cáo quản trị đều phải theo nguyên tắc này.
2. Tạo cột "Thành tiền" trên bảng giao dịch hàng triệu dòng
Vừa nặng file như đã nói ở trên, vừa không cần thiết. Nếu chỉ để lấy tổng, một measure dùng SUMX duyệt qua đơn giá nhân số lượng cho ra đúng kết quả mà không lưu gì. Nếu bạn thật sự cần cột này để lọc hay xếp hạng, hãy tạo nó ở Power Query.
3. Dùng measure ở chỗ cần một thuộc tính để lọc
Chiều ngược lại cũng hay gặp. Bạn viết một measure phân loại khách hàng thành Lớn / Vừa / Nhỏ, rồi tìm cách kéo nó vào slicer — không được, và không có mẹo nào làm được một cách sạch sẽ. Phân loại gắn với từng khách hàng là thuộc tính, phải là calculated column trên bảng khách hàng, hoặc tốt hơn nữa là một cột có sẵn từ nguồn.
Mẹo tự kiểm: nếu công thức của bạn trả về chữ và bạn muốn đem đi lọc, gần như chắc chắn nó phải là column. Nếu công thức trả về số và con số đó phải đổi khi người xem bấm slicer, nó phải là measure.
Câu hỏi thường gặp
Cột tính toán nên làm ở Power Query hay DAX?
Ưu tiên Power Query cho mọi cột cố định, không phụ thuộc bộ lọc. Chỉ dùng calculated column khi công thức cần đến thứ mà Power Query không có: quan hệ giữa các bảng, hoặc một measure đã tính sẵn.
Vì sao tôi không kéo được measure vào slicer?
Vì measure không phải dữ liệu. Slicer cần một danh sách giá trị có sẵn để hiển thị, mà measure chỉ tồn tại khi có ngữ cảnh lọc — trước khi bạn bấm, nó chưa có giá trị nào. Muốn lọc theo tiêu chí đó, hãy chuyển nó thành column.
File Power BI của tôi quá nặng, nên xóa cột nào trước?
Xem trong View của Power BI Desktop hoặc dùng công cụ đo dung lượng mô hình, tìm những cột chiếm nhiều dung lượng nhất. Thủ phạm thường là cột số có rất nhiều giá trị khác nhau (thành tiền, mã chứng từ chi tiết) và cột ngày giờ đầy đủ đến từng giây. Với cột ngày giờ, tách riêng phần ngày và phần giờ thành hai cột thường giảm dung lượng đáng kể.
Measure của tôi ra cùng một con số ở mọi dòng, vì sao?
Gần như luôn là do thiếu quan hệ giữa bảng đang hiển thị và bảng chứa dữ liệu, nên bộ lọc của dòng không truyền được sang. Kiểm tra lại sơ đồ quan hệ trong Model view và chiều mũi tên lọc trước khi nghi ngờ công thức.
Chọn đúng ngay từ đầu để không phải làm lại
Hai khái niệm này nghe đơn giản nhưng quyết định gần như toàn bộ chất lượng mô hình về sau: file nặng hay nhẹ, báo cáo chạy nhanh hay ì, và quan trọng nhất là con số đưa cho sếp có đúng hay không. Chọn sai thì báo cáo vẫn hiện ra bình thường — đó mới là phần đáng ngại.
Nếu bạn muốn nhìn thấy các nguyên tắc này áp dụng trên một mô hình hoàn chỉnh thay vì ví dụ rời rạc, hãy xem thử các bộ báo cáo Power BI mẫu của EzTech — tất cả đều xem demo trực tiếp được. Còn nếu bạn muốn học bài bản từ mô hình dữ liệu đến DAX và dựng báo cáo quản trị hoàn chỉnh, khóa DATA BUSINESS đi đúng lộ trình đó. Cần tư vấn xem mình nên bắt đầu từ đâu, bạn cứ liên hệ với đội ngũ EzTech.