Skip to main content

Hàm IF trong Power Query: nhiều điều kiện và xử lý null

9 phút đọc

Trong Power Query, bạn viết điều kiện bằng if ... then ... else ..., thay vì cú pháp IF có dấu phẩy như Excel. Để kết hợp nhiều điều kiện, dùng and, or hoặc nối các nhánh else if. Cách dễ kiểm tra nhất là bắt đầu bằng một quy tắc nhỏ, rồi thử cả giá trị sát ngưỡng và dữ liệu thiếu.

Bài này dùng bảng công nợ giả lập của một cửa hàng để hướng dẫn từ thao tác tạo cột đến đoạn mã M có thể dán vào Advanced Editor. Mục tiêu là phân loại đúng từng dòng trước khi đưa kết quả lên báo cáo.

Hiểu cú pháp IF trong Power Query

Người dùng thường gọi là “hàm IF”, nhưng trong ngôn ngữ M, đây là biểu thức điều kiện. Bạn viết từ khoá bằng chữ thường, có đủ ba phần: điều kiện sau if, kết quả đúng sau then, kết quả còn lại sau else.

if [SoNgayQuaHan] > 0 then "Quá hạn" else "Trong hạn"

Dấu ngoặc vuông tham chiếu cột trong dòng đang xét; dấu ngoặc kép bao quanh chuỗi văn bản. Trong ô công thức của Custom Column, nhập biểu thức này trực tiếp, không thêm dấu bằng đầu dòng như khi gõ công thức vào ô Excel.

Công thức trên chỉ phù hợp khi số ngày đã đầy đủ và đúng kiểu. Đừng vội áp dụng cho bảng thật nếu cột còn chứa chữ, lỗi chuyển đổi hoặc giá trị thiếu. Nếu chưa quen nơi nhập công thức, xem hướng dẫn mở và sử dụng Power Query Editor trước.

Tạo cột có điều kiện bằng giao diện

Với một điều kiện đơn giản, Conditional Column giúp bạn bắt đầu mà chưa cần tự viết mã. Chuẩn bị cột SoNgayQuaHan kiểu số nguyên, sau đó thực hiện:

  1. Mở bảng trong Power Query Editor, chọn Add Column rồi Conditional Column.
  2. Đặt tên cột mới là NhomNo.
  3. Chọn SoNgayQuaHan, phép so sánh lớn hơn, giá trị 0; đầu ra là Quá hạn.
  4. Ở Else, nhập Trong hạn, xác nhận và đặt kiểu cột kết quả là Text.

Nếu muốn lấy đầu ra từ một cột khác, hãy chuyển lựa chọn đầu ra sang Column thay vì gõ tên cột như văn bản. Hai thao tác này cho kết quả khác nhau: nhập “SoTien” sẽ tạo chuỗi chữ, còn chọn cột SoTien mới lấy giá trị từng dòng.

Conditional Column phù hợp khi quy tắc dễ trình bày thành từng dòng. Custom Column thuận tiện hơn khi cần ghép điều kiện, đặt dấu ngoặc hoặc xử lý null. Bạn có thể đọc mã mà giao diện tạo ra để nối hai cách làm này.

Ví dụ hoàn chỉnh: phân nhóm công nợ cửa hàng

Giả sử SoNgayQuaHan đã được tính tại ngày chốt báo cáo: số âm là chưa đến hạn, 0 là đến hạn hôm nay, số dương là đã trễ. Đây là quy ước của ví dụ, không phải cách tính tự động có sẵn trong IF. Sáu hoá đơn giả lập sau giúp kiểm tra cả điểm ranh giới:

Mã đơnSố tiền (đồng)Số ngày quá hạnNhóm mong đợi
HD012.000.000-2Trong hạn
HD025.000.0000Trong hạn
HD033.000.0001Quá hạn 1–30 ngày
HD048.000.00030Quá hạn 1–30 ngày
HD0512.000.00031Quá hạn trên 30 ngày
HD061.000.000nullThiếu dữ liệu

Tạo Blank Query, mở Advanced Editor và thay nội dung bằng mã dưới đây. Đoạn mã tự tạo dữ liệu, nên không cần file tải về hay bảng Excel có sẵn.

let
    Source = #table(
        type table [MaDon = text, SoTien = number,
                    SoNgayQuaHan = nullable number],
        {
            {"HD01", 2000000, -2},
            {"HD02", 5000000, 0},
            {"HD03", 3000000, 1},
            {"HD04", 8000000, 30},
            {"HD05", 12000000, 31},
            {"HD06", 1000000, null}
        }
    ),
    AddedGroup = Table.AddColumn(
        Source,
        "NhomNo",
        each
            if [SoNgayQuaHan] = null then "Thiếu dữ liệu"
            else if [SoNgayQuaHan] > 30 then "Quá hạn trên 30 ngày"
            else if [SoNgayQuaHan] > 0 then "Quá hạn 1–30 ngày"
            else "Trong hạn",
        type text
    )
in
    AddedGroup

Từ khoá each giúp biểu thức được áp dụng cho từng dòng trong Table.AddColumn. Phần type text khai báo kiểu của cột mới. Khi chỉ dán phần điều kiện vào hộp Custom Column, bạn không cần bọc thêm Table.AddColumn hoặc each.

Đối chiếu kết quả: nhóm Trong hạn có 7 triệu đồng; nhóm 1–30 ngày có 11 triệu; nhóm trên 30 ngày có 12 triệu; nhóm thiếu dữ liệu có 1 triệu. Tổng vẫn là 31 triệu và bảng vẫn có sáu dòng. Phép thêm cột không có lý do làm mất hoá đơn.

IF nhiều điều kiện: xét thứ tự trước, ghép AND/OR sau

Trong chuỗi else if, nhánh đúng đầu tiên quyết định kết quả. Vì vậy, cần kiểm tra trên 30 ngày trước khi kiểm tra trên 0 ngày. Nếu đảo hai nhánh, hoá đơn trễ 31 ngày sẽ bị xếp vào nhóm 1–30 ngày vì đã thoả điều kiện trên 0.

Sơ đồ kiểm tra dữ liệu thiếu trước, rồi lần lượt xét ngưỡng trên 30 và trên 0 để phân nhóm công nợ.
Kiểm tra nhánh đặc biệt và ngưỡng lớn trước để tránh xếp nhầm nhóm.
Kiểm tra nhánh đặc biệt và ngưỡng lớn trước để tránh xếp nhầm nhóm.

Giả sử cửa hàng muốn đánh dấu đơn cần gọi nhắc: số ngày quá hạn lớn hơn 0 và số tiền ít nhất 5 triệu đồng. Với bảng mẫu đã chuẩn kiểu, tạo một Custom Column khác:

if [SoNgayQuaHan] = null or [SoTien] = null then "Cần kiểm tra"
else if [SoNgayQuaHan] > 0 and [SoTien] >= 5000000 then "Gọi nhắc"
else "Theo dõi thường"

HD04 và HD05 được đánh dấu Gọi nhắc; HD06 là Cần kiểm tra. HD02 có đủ 5 triệu nhưng chưa quá hạn nên không được chọn. Điều này cho thấy cần thử từng nửa của điều kiện, thay vì chỉ nhìn một dòng có cả hai tiêu chí đúng.

Khi trộn and với or, hãy dùng dấu ngoặc để thể hiện nhóm ý muốn. Ví dụ ([KhuVuc] = "Hà Nội" or [KhuVuc] = "Đà Nẵng") and [SoTien] >= 5000000 yêu cầu cửa hàng thuộc một trong hai khu vực, đồng thời đạt ngưỡng tiền. Ví dụ này giả định KhuVuc và SoTien đã được chuẩn hoá, không có lỗi.

Xử lý null, chuỗi rỗng và lỗi chuyển kiểu

Ba tình huống này cần được phân biệt. Null biểu thị thiếu giá trị; chuỗi rỗng là văn bản không có ký tự; Error là lỗi khi tính hoặc chuyển đổi. Một nhánh kiểm tra null không tự xử lý được mọi lỗi của cột.

Trong M, có thể kiểm tra thiếu dữ liệu bằng [SoNgayQuaHan] = null. Với cột text như GhiChu, chuỗi rỗng hoặc chỉ có khoảng trắng cần quy tắc riêng:

if [GhiChu] = null then "Chưa ghi chú"
else if Text.Trim([GhiChu]) = "" then "Chưa ghi chú"
else [GhiChu]

Biểu thức này giả định GhiChu là text hoặc null, chưa chứa Error. Nếu nguồn nhập tay có chuỗi không chuyển được thành số, hãy giữ cột gốc và tạo cột kiểm tra. Ví dụ dưới đây nhận cột SoNgayText kiểu text hoặc null:

let
    KetQua = try Number.FromText([SoNgayText], "vi-VN")
in
    if KetQua[HasError] then "Lỗi chuyển số"
    else if KetQua[Value] = null then "Thiếu dữ liệu"
    else if KetQua[Value] > 30 then "Quá hạn trên 30 ngày"
    else if KetQua[Value] > 0 then "Quá hạn 1–30 ngày"
    else "Trong hạn"

Thử lần lượt “31”, “0”, null và “abc”: kết quả mong đợi là trên 30 ngày, trong hạn, thiếu dữ liệu và lỗi chuyển số. Culture vi-VN phải khớp quy ước của nguồn, nhất là khi dữ liệu chứa dấu phân cách số. Đừng thay mọi lỗi bằng 0: bạn sẽ biến dữ liệu hỏng thành hoá đơn có vẻ trong hạn.

Minh hoạ bảng dữ liệu có ô trống và ô lỗi được kiểm tra, giữ dấu cảnh báo ở cột phân loại kết quả.
Tách dữ liệu thiếu và lỗi chuyển đổi để người làm báo cáo còn kiểm tra lại được.
Tách dữ liệu thiếu và lỗi chuyển đổi để người làm báo cáo còn kiểm tra lại được.

Kiểm tra trước khi dùng cho báo cáo định kỳ

  • Thử các mốc -1, 0, 1, 30, 31 và null để kiểm tra ranh giới.
  • Kiểm tra tên cột, kiểu số, cột text có khoảng trắng và giá trị lỗi.
  • Đối chiếu số dòng, tổng tiền trước và sau khi thêm cột.
  • Lọc riêng nhóm Thiếu dữ liệu và Lỗi chuyển số để sửa nguồn.
  • Làm mới dữ liệu sau khi thêm một hoá đơn thử, rồi kiểm tra quy tắc có áp dụng không.

Phân nhóm trong Power Query được tính khi truy vấn được đánh giá và làm mới, không tự đổi theo mỗi lựa chọn slicer như một measure. Nếu cần nối công nợ với danh mục khách hàng trước khi phân loại, xem cách đối chiếu công nợ bằng Power Query. Với bảng quy tắc gồm nhiều mã và nhóm, dùng Merge để dò bảng danh mục thường dễ bảo trì hơn một chuỗi IF rất dài.

Bạn có thể đối chiếu cú pháp và cách tạo cột trong tài liệu Microsoft: biểu thức điều kiện M, Conditional Column và xử lý lỗi trong Power Query.

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

Tại sao nhập IF giống Excel lại báo lỗi?

Power Query dùng ngôn ngữ M, cần cú pháp if, then, else bằng chữ thường. Hãy kiểm tra bạn đang nhập trong Custom Column hay đang tạo cột DAX ở nơi khác.

Có bắt buộc phải viết else không?

Có. Mỗi biểu thức if cần nhánh else. Nếu chưa có kết quả phù hợp cho trường hợp còn lại, có thể trả null, nhưng nên ghi rõ ý nghĩa của giá trị thiếu này.

Có thể dùng IF trong cả Excel và Power BI không?

Có, nếu bạn đang ở Power Query Editor của hai công cụ thì cùng dùng cú pháp M. Công thức trong ô Excel hoặc cột DAX dùng cú pháp khác.

Khi nào nên thay IF lồng nhau bằng bảng quy tắc?

Khi nhóm phụ thuộc nhiều mã cố định hoặc người dùng thường xuyên sửa danh mục, nên tách quy tắc ra bảng để dễ rà soát. Với vài ngưỡng có thứ tự rõ ràng, else if vẫn dễ đọc.

Nếu bạn cần người thiết kế luồng làm sạch dữ liệu và báo cáo công nợ hoàn chỉnh, có thể xem báo giá làm Power BI trên SenData. Khi gửi yêu cầu, hãy kèm bảng mẫu đã ẩn thông tin riêng và quy tắc phân nhóm để freelancer hiểu đúng bài toán.

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 IF trong Power Query: điều kiện, null và lỗi | SenData