Skip to main content

Hàm DAX trong Power Query: phân biệt DAX và M

8 phút đọc

Bạn không dùng hàm DAX trong Power Query Editor: công cụ này dùng ngôn ngữ M để nhập và biến đổi dữ liệu. DAX dùng trong mô hình dữ liệu của Power BI hoặc Power Pivot để tạo measure, cột và bảng tính toán. Nếu đang gặp lỗi khi dán SUMX vào Custom Column, bạn cần đổi nơi viết công thức hoặc viết lại phép biến đổi bằng M.

Vì sao dễ nhầm DAX với Power Query?

Khi làm báo cáo doanh thu, bạn có thể thấy hai lệnh cùng mang ý nghĩa thêm cột: Custom Column trong Power Query và New column trong Power BI. Cả hai đều có thể nhân số lượng với đơn giá, nhưng thuộc hai giai đoạn khác nhau. Công thức đúng ở cửa sổ này có thể báo lỗi ở cửa sổ kia.

Trong Power BI Desktop, chọn Transform data để mở Power Query Editor. Tại đây, thanh công thức và Advanced Editor làm việc với M. Sau khi Close & Apply, bạn trở về môi trường mô hình và báo cáo; lệnh New measure là nơi tạo chỉ tiêu bằng DAX. Hãy xác định cửa sổ đang mở trước khi sửa dấu ngoặc.

Dữ liệu nguồn được làm sạch, đưa vào bảng rồi tính chỉ tiêu và biểu đồ
Chuẩn bị dữ liệu trước, tính chỉ tiêu trong mô hình sau.
Chuẩn bị dữ liệu trước, tính chỉ tiêu trong mô hình sau.

Chọn M hay DAX theo kết quả cần có

Nhu cầuNơi phù hợpLý do
Bỏ khoảng trắng, đổi kiểu ngày, ghép filePower Query, dùng MChuẩn hoá dữ liệu đầu vào
Thêm thành tiền cho từng dòngCustom Column bằng M hoặc calculated column bằng DAXCần giá trị ở mức dòng
Tổng doanh thu đổi theo cửa hàng đang chọnMeasure bằng DAXCần tính theo ngữ cảnh lọc
Biên lợi nhuận của phần dữ liệu đang xemMeasure bằng DAXCần chia hai tổng đúng phạm vi

Đây là cách chọn thực hành, không phải quy tắc rằng mọi phép tính theo dòng đều bắt buộc dùng M. Một cột phục vụ phân nhóm trong mô hình vẫn có thể viết bằng DAX. Bạn nên cân nhắc nguồn dữ liệu, khả năng bảo trì và yêu cầu sử dụng cột đó.

Ví dụ M: tạo thành tiền cho từng dòng bán hàng

Dữ liệu dưới đây hoàn toàn giả lập, gồm ba dòng bán hàng của hai cửa hàng. Mỗi dòng có số lượng, đơn giá và giá vốn đơn vị. Để tự chạy, trong Power BI Desktop mở Transform data, tạo Blank Query, mở Advanced Editor rồi thay nội dung bằng đoạn M này.

let
    Source = #table(
        type table [CuaHang = text, SoLuong = Int64.Type,
            DonGia = number, GiaVonDonVi = number],
        {
            {"Ha Noi", 2, 150000, 100000},
            {"Da Nang", 3, 200000, 140000},
            {"Ha Noi", 1, 300000, 240000}
        }
    ),
    ThemThanhTien = Table.AddColumn(
        Source, "ThanhTien",
        each [SoLuong] * [DonGia], type number
    )
in
    ThemThanhTien

Đặt tên query là BanHang và bảo đảm query được bật Enable load. Kết quả cột ThanhTien lần lượt là 300.000, 600.000 và 300.000 đồng. Trong hộp Custom Column, nếu bảng nguồn đã tồn tại, bạn chỉ cần nhập biểu thức [SoLuong] * [DonGia]; không dán cả khối let vào hộp biểu thức theo dòng.

Trong đoạn đầy đủ, each định nghĩa phép tính được áp dụng với từng dòng đầu vào. Table.AddColumn nhận bảng nguồn, tên cột mới, hàm tính và kiểu dữ liệu. Đây là cú pháp M, không phải phiên bản khác của SUMX.

Nếu dữ liệu đến từ nhiều bảng bán hàng, hãy xử lý cấu trúc trước khi thêm phép tính. Bài phân biệt Merge và Append trong Power Query giúp bạn chọn cách ghép phù hợp và tránh làm tăng số dòng ngoài ý muốn.

Ví dụ DAX: doanh thu thay đổi theo bộ lọc

Sau Close & Apply, chọn New measure và tạo từng measure dưới đây, mỗi lần một công thức. Các ví dụ dùng dấu phẩy phân tách đối số; nếu thiết lập DAX của máy dùng dấu chấm phẩy, hãy đổi dấu phân tách tương ứng.

Tong doanh thu = SUM(BanHang[ThanhTien])

Thêm một Table visual gồm BanHang[CuaHang] và measure Tong doanh thu. Hà Nội cho kết quả 600.000 đồng, Đà Nẵng 600.000 đồng, tổng cộng 1.200.000 đồng. Thêm slicer CuaHang và chỉ chọn Ha Noi: tổng trên card sử dụng cùng measure sẽ còn 600.000 đồng.

Bộ lọc không chạy lại bước Custom Column trong Power Query. Nó thay đổi tập dữ liệu mà measure tổng hợp trong mô hình. Vì vậy, số thành tiền của từng giao dịch vẫn giữ nguyên, còn doanh thu đang hiển thị đổi theo lựa chọn.

Bạn cũng có thể tính doanh thu trực tiếp từ số lượng và đơn giá, không cần tạo cột ThanhTien. Tạo measure thứ hai để đối chiếu:

Doanh thu SUMX =
SUMX(BanHang, BanHang[SoLuong] * BanHang[DonGia])

Hai measure phải cùng kết quả với bộ dữ liệu này. Nếu khác nhau trên dữ liệu thực tế, hãy kiểm tra kiểu số, quy tắc làm tròn hoặc việc cột thành tiền đã gồm chiết khấu hay chưa. Không cộng cả hai measure vì chúng đang mô tả cùng một chỉ tiêu.

Cột tính toán khác measure ở điểm nào?

Với mô hình Import trong ví dụ, cột tính toán DAX được lưu theo từng dòng và không tính lại giá trị của từng dòng chỉ vì bạn bấm slicer. Measure được tính khi báo cáo cần kết quả, theo các bộ lọc đang tác động. Sự khác nhau này quyết định bạn nên dùng cột làm nhãn phân nhóm hay measure làm giá trị phân tích.

Bảng bán hàng chia thành nhánh thêm cột theo dòng và nhánh lọc dữ liệu để tính một chỉ tiêu
Cột bổ sung thuộc tính theo dòng; measure trả kết quả theo phạm vi đang xem.
Cột bổ sung thuộc tính theo dòng; measure trả kết quả theo phạm vi đang xem.

Chẳng hạn, phân loại giao dịch lớn hay nhỏ có thể cần một cột để đưa vào slicer. Ngược lại, doanh thu của cửa hàng đang chọn nên là measure. Nếu cần calculated column DAX tương đương ví dụ M, chọn New column rồi nhập:

ThanhTien DAX = BanHang[SoLuong] * BanHang[DonGia]

Đây là cách thay thế để học và đối chiếu, không phải yêu cầu giữ cả hai cột trong báo cáo chính thức. Bạn có thể đọc tiếp các nhóm hàm DAX cơ bản khi đã phân biệt được vị trí nhập công thức.

Tính biên lợi nhuận: đừng cộng tỷ lệ từng dòng

Để kiểm tra một tình huống thường gặp trong báo cáo cửa hàng, tạo lần lượt ba measure:

Tong gia von =
SUMX(BanHang, BanHang[SoLuong] * BanHang[GiaVonDonVi])
Loi nhuan gop = [Tong doanh thu] - [Tong gia von]
Bien loi nhuan = DIVIDE([Loi nhuan gop], [Tong doanh thu])

Định dạng measure cuối thành Percentage. Tổng giá vốn là 860.000 đồng, lợi nhuận gộp 340.000 đồng, biên lợi nhuận khoảng 28,33%. Khi chọn Hà Nội, giá vốn là 440.000 đồng và biên còn khoảng 26,67%.

Ở đây, tỷ lệ tổng được tính từ lợi nhuận tổng chia doanh thu tổng. Bạn không cộng hoặc lấy trung bình đơn giản tỷ lệ của ba dòng giao dịch. DIVIDE cũng giúp xử lý mẫu số bằng không; khi không truyền kết quả thay thế, hàm trả BLANK trong tình huống chia cho không.

Checklist xử lý lỗi trước khi đổi công thức

  • Đúng cửa sổ: Custom Column và Advanced Editor dùng M; New measure và New column trong mô hình dùng DAX.
  • Đúng loại đối tượng: phép nhân hai cột theo dòng không thể luôn chép nguyên thành measure; SUMX diễn đạt việc tính từng dòng rồi cộng.
  • Đúng tên: kiểm tra tên query BanHang và các cột; M phân biệt chữ hoa, chữ thường.
  • Đúng dữ liệu: số lượng và đơn giá phải là kiểu số; đừng xoá lỗi chuyển kiểu rồi mặc định tổng vẫn đúng.
  • Đúng phạm vi: thử cả tổng toàn bộ và một cửa hàng; nếu sau này dùng bảng danh mục, kiểm tra quan hệ lọc.

Trước khi bàn giao, lưu ba con số đối soát: doanh thu 1.200.000 đồng, giá vốn 860.000 đồng và lợi nhuận 340.000 đồng. Chúng là kết quả của ví dụ, không phải định mức kinh doanh. Thay dữ liệu nguồn cần tính lại bộ số kiểm tra.

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

Có chuyển tự động mọi hàm DAX sang M được không?

Không có phép thay tên hàm áp dụng cho mọi trường hợp. Bạn cần xác định đầu ra mong muốn: bảng đã biến đổi, một cột theo dòng hay chỉ tiêu phản ứng với bộ lọc. Sau đó viết lại bằng ngôn ngữ và đối tượng phù hợp.

DAX Query View có phải Power Query Editor không?

Không. DAX Query View phục vụ truy vấn DAX trên mô hình. Power Query Editor dùng M để chuẩn bị dữ liệu. Việc cả hai đều có chữ Query dễ gây nhầm, nhưng bạn không chuyển sang DAX Query View để thay bước làm sạch dữ liệu nguồn.

Trong Excel có dùng được quy trình này không?

Có thể chuẩn bị dữ liệu bằng Power Query rồi dùng DAX trong Data Model qua Power Pivot, nếu phiên bản Excel hỗ trợ. Bài tạo measure DAX trong Excel hướng dẫn riêng phần thao tác và PivotTable.

Nên học M hay DAX trước?

Nếu dữ liệu còn sai kiểu, rời rạc hoặc lẫn dòng tổng, hãy học các thao tác Power Query trước. Khi đã có bảng sạch và cần chỉ tiêu đổi theo bộ lọc, bắt đầu với measure DAX đơn giản rồi kiểm tra kết quả trên một nhóm nhỏ.

Nếu bạn cần người chuẩn hoá dữ liệu và xây dựng bộ chỉ tiêu cho báo cáo thực tế, có thể tham khảo báo giá làm Power BI trên SenData. Khi trao đổi, hãy chuẩn bị cấu trúc bảng mẫu, định nghĩa doanh thu và kết quả đối soát mong muốn để freelancer hiểu đúng phạm vi.

Sẵn sàng xây dựng dashboard Power BI?

Kết nối với freelancer Power BI phù hợp, 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ú

Đào Ngọc Tú

Freelancer Power BI

Cộng tác viên chuyên gia tại SenData. Chia sẻ kiến thức về phát triển Power BI, trực quan hóa dữ liệu và best practice business intelligence.

Đọc tiếp

Quay lại tất cả bài viết
Hàm DAX trong Power Query: dùng M hay DAX? | SenData