EzTech

RELATED và LOOKUPVALUE trong Power BI: khác gì, dùng khi nào

2026-10-05 · Power BI & Dashboard

RELATED và LOOKUPVALUE trong Power BI: khác gì, dùng khi nào

Trong Excel, muốn lấy nhóm hàng cho từng dòng bán thì các bạn viết VLOOKUP. Sang Power BI, cùng việc đó có hai hàm: RELATED và LOOKUPVALUE. Đội ngũ EzTech thử cả hai trên file bán hàng mẫu 9.998 dòng, 35 mặt hàng: với danh mục sạch, hai hàm cho cùng một kết quả ở cả 9.998 dòng.

Khác biệt chỉ lộ ra khi danh mục có vấn đề: thiếu một mặt hàng, khai trùng một mã, hoặc hai bảng chưa được nối với nhau. Bài này dựng mô hình trong Power BI Desktop (phiên bản 2.158), cố ý làm hỏng danh mục theo từng kiểu rồi ghi lại cách mỗi hàm phản ứng. Các câu báo lỗi trích trong bài là câu Power BI trả về trong lần chạy đó.

Hai sợi xích kim loại bắt chéo và móc vào nhau ở mắt giữa, minh họa việc nối bảng dữ liệu bằng RELATED và LOOKUPVALUE trong Power BI
Hai hàm cùng lấy dữ liệu từ bảng khác, nhưng đi bằng hai đường khác nhau. (Ảnh: StockSnap)

RELATED và LOOKUPVALUE khác nhau ở đâu

Mô hình dùng trong bài có hai bảng: BanHang (9.998 dòng bán, có cột Tên hàng) và SanPham (danh mục 35 mặt hàng, mỗi mặt hàng thuộc một nhóm). Hai bảng nối với nhau qua cột Tên hàng, quan hệ many-to-one: nhiều dòng bán trỏ về một dòng trong danh mục.

Tiêu chíRELATEDLOOKUPVALUE
Cần quan hệ giữa hai bảngCó, kiểu many-to-oneKhông cần
Cách tìmĐi theo quan hệ đã khai trong mô hìnhSo giá trị ở một hoặc nhiều cột, khớp chính xác
Không tìm thấyTrả về trốngTrả về trống, hoặc giá trị dự phòng do bạn đặt
Danh mục khai trùng mãKhông giữ được quan hệ many-to-one, refresh báo lỗiBáo lỗi nếu các dòng trùng mang giá trị khác nhau
Khi đã có quan hệMicrosoft khuyên dùng hàm nàyChạy được nhưng kém hiệu quả hơn

RELATED: lấy cột từ bảng danh mục theo quan hệ

Cú pháp chỉ có một tham số: RELATED(<cột cần lấy>). Tạo cột tính trong bảng BanHang:

Nhóm hàng (DM) = RELATED(SanPham[Nhóm hàng])

Kết quả: 9.998/9.998 dòng nhận đúng nhóm hàng. Theo tài liệu của Microsoft, RELATED đi theo một quan hệ many-to-one có sẵn để lấy giá trị ở bảng phía "một", và hàm cần ngữ cảnh dòng: chỉ dùng được trong cột tính, hoặc lồng trong một hàm duyệt từng dòng như SUMX, FILTER.

Một câu báo lỗi, bốn nguyên nhân

Khi RELATED không tìm được đường, Power BI trả về đúng một câu:

The column 'SanPham[Nhóm hàng]' either doesn't exist or doesn't have a relationship to any table available in the current context.

Trong lần chạy thử, câu này xuất hiện ở bốn tình huống khác nhau:

  1. Hai bảng chưa có quan hệ. Gọi RELATED tới một bảng danh mục chưa nối với BanHang. Cách sửa: tạo quan hệ trong Model view, hoặc dùng LOOKUPVALUE.
  2. Dùng RELATED trong measure mà không có ngữ cảnh dòng. Viết RELATED(SanPham[Nhóm hàng]) đứng một mình trong measure là báo lỗi. Đặt nó vào trong SUMX thì chạy: SUMX(BanHang, IF(RELATED(SanPham[Nhóm hàng]) = "Phụ kiện", BanHang[Số lượng])) ra 52.695 sản phẩm, khớp với phép cộng trực tiếp số lượng nhóm Phụ kiện.
  3. Đi ngược chiều quan hệ. Tạo cột tính trong bảng SanPham rồi gọi RELATED(BanHang[Số lượng]). Mỗi mặt hàng có hàng trăm dòng bán nên không có "một giá trị" để lấy. Chiều này dùng RELATEDTABLE: COUNTROWS(RELATEDTABLE(BanHang)) ra 608 dòng cho "Cáp sạc Type-C", cộng cả 35 mặt hàng đúng 9.998 dòng.
  4. Quan hệ kiểu many-to-many. Microsoft xếp quan hệ many-to-many vào loại quan hệ hạn chế (limited relationship) và ghi rõ RELATED không lấy được giá trị qua loại quan hệ này. Lần chạy thử cũng báo đúng câu lỗi trên.
Sơ đồ bốn nguyên nhân khiến RELATED báo lỗi doesn't have a relationship: chưa có quan hệ, measure không có ngữ cảnh dòng, đi ngược chiều quan hệ, quan hệ many-to-many, kèm cách sửa từng trường hợp
Cùng một câu báo lỗi, nhưng mỗi nguyên nhân có một cách sửa riêng.

LOOKUPVALUE: tra theo giá trị, không cần quan hệ

Cú pháp theo tài liệu Microsoft:

LOOKUPVALUE(<cột kết quả>, <cột tìm>, <giá trị tìm> [, <cột tìm 2>, <giá trị tìm 2>]… [, <giá trị dự phòng>])

Hàm trả giá trị ở dòng khớp chính xác tất cả các cặp điều kiện. Cùng việc lấy nhóm hàng: LOOKUPVALUE(SanPham[Nhóm hàng], SanPham[Tên hàng], BanHang[Tên hàng]). Vì tra theo giá trị nên hàm chạy được cả khi hai bảng không có quan hệ nào.

Danh mục thiếu một mặt hàng

Đội ngũ EzTech bỏ "Giá đỡ điện thoại" ra khỏi danh mục, giả lập mặt hàng mới bán nhưng chưa ai khai báo. Mặt hàng này có 562 dòng bán. Kết quả: 9.436 dòng nhận đúng nhóm, 562 dòng trả về trống. Thêm giá trị dự phòng ở tham số cuối, LOOKUPVALUE(…, BanHang[Tên hàng], "Chưa khai báo"), thì đúng 562 dòng đó hiện chữ "Chưa khai báo".

Danh mục khai trùng mã

Lần này "Kính cường lực" được khai hai lần, một lần thuộc nhóm "Phụ kiện", một lần thuộc nhóm "Điện thoại", như khi có người gõ nhầm. Công thức không trả kết quả nào, kể cả cho 9.442 dòng của các mặt hàng khác:

A table of multiple values was supplied where a single value was expected for column 'SanPham_Trung'[Nhóm hàng].

(SanPham_Trung là tên bảng danh mục trùng mã trong lần thử.) Nếu hai dòng trùng có cùng nhóm, ví dụ dán thừa một dòng giống hệt, LOOKUPVALUE không báo lỗi và vẫn đúng cả 9.998 dòng. Tài liệu Microsoft mô tả đúng như vậy: các dòng khớp cùng giá trị thì trả giá trị đó, khác nhau thì báo lỗi.

Bẫy của giá trị dự phòng

Với danh mục trùng mã khác nhóm ở trên, thêm giá trị dự phòng thì lỗi biến mất: 556 dòng "Kính cường lực" nhận giá trị dự phòng, các dòng khác ra kết quả bình thường. Lý do nằm trong tài liệu: tham số này được trả về khi điều kiện lọc còn không hoặc nhiều hơn một giá trị khác nhau.

Hệ quả: nếu bạn đặt giá trị dự phòng là "Chưa khai báo", người đọc báo cáo sẽ hiểu mặt hàng đó chưa có trong danh mục, trong khi thật ra nó bị khai hai lần. Nên đặt một nhãn trung tính như "Kiểm tra danh mục", và đếm riêng số mã trùng trong danh mục sau mỗi lần cập nhật. Microsoft cũng khuyên không bọc IFERROR quanh LOOKUPVALUE; muốn xử lý lỗi thì dùng chính tham số dự phòng.

Danh mục thiếu mã: tổng vẫn khớp, nhóm thì lệch

Với RELATED, mặt hàng chưa khai báo không gây lỗi nào. Đội ngũ EzTech nối BanHang với bảng danh mục thiếu "Giá đỡ điện thoại": RELATED trả trống ở đúng 562 dòng. Bảng tổng hợp theo nhóm hàng xuất hiện thêm một dòng không tên:

Nhóm hàngSố dòng bánGhi chú
Phụ kiện2.858Đúng ra là 3.420
(trống)562Toàn bộ dòng của "Giá đỡ điện thoại"
5 nhóm còn lại6.578Không đổi
Tổng9.998Vẫn đủ

Tổng vẫn đủ 9.998 dòng nên ai chỉ nhìn dòng tổng sẽ không thấy gì sai. Microsoft gọi dòng trống này là dòng ảo (blank virtual row): khi giá trị ở bảng "nhiều" không có trong bảng "một", Power BI thêm một dòng trống vào bảng "một" để chứa phần không khớp. Đếm thử: bảng danh mục có 34 dòng, nhưng VALUES trên cột Tên hàng trả về 35 giá trị, giá trị thứ 35 là dòng trống đó.

Sơ đồ so sánh số dòng bán nhóm Phụ kiện: đúng là 3.420 dòng, khi danh mục thiếu một mặt hàng chỉ còn 2.858 dòng và 562 dòng rơi vào nhóm trống, tổng vẫn 9.998 dòng
Danh mục thiếu một mã: nhóm Phụ kiện hụt 562 dòng, còn tổng thì không đổi.

Cách bắt: thêm một measure đếm số dòng bán có nhóm hàng trống, đặt nó trên trang kiểm tra của báo cáo. Sau mỗi lần refresh, con số này khác 0 là danh mục đang thiếu mã.

Danh mục trùng mã: refresh dừng lại

Quan hệ many-to-one đòi cột ở phía "một" không có giá trị trùng. Đội ngũ EzTech cho mô hình chạy ổn với danh mục sạch, sau đó thêm một dòng "Kính cường lực" thuộc nhóm "Điện thoại" vào nguồn rồi refresh. Power BI báo:

Column 'Tên hàng' in Table 'SanPham_Sau' contains a duplicate value 'Kính cường lực' and this is not allowed for columns on the one side of a many-to-one relationship or for columns that are used as the primary key of a table.

Tài liệu Microsoft ghi: nếu một lần refresh nạp giá trị trùng vào cột phía "một", toàn bộ lần refresh đó thất bại. Cách xử lý đúng là sửa danh mục ở nguồn cho hết trùng mã.

Cách xử lý sai mà nhiều người chọn là đổi quan hệ sang many-to-many để refresh chạy lại. Lần thử cho thấy cái giá: RELATED báo lỗi như ở mục trên, còn bảng tổng hợp theo nhóm hàng đếm 556 dòng "Kính cường lực" ở cả nhóm Phụ kiện lẫn nhóm Điện thoại. Cộng các nhóm lại ra 10.554 dòng, trong khi bảng bán hàng chỉ có 9.998 dòng.

Nên dùng hàm nào

  • Đã có quan hệ many-to-one: dùng RELATED. Tài liệu LOOKUPVALUE của Microsoft ghi: khi đã có quan hệ, phần lớn trường hợp dùng RELATED hiệu quả hơn. Trên 9.998 dòng, lần đo của đội ngũ EzTech chỉ chênh vài mili giây (8,2 so với 12,0 mili giây, trung vị 7 lần chạy). Lý do thực tế hơn: RELATED đi theo quan hệ đã khai, danh mục trùng mã là refresh báo ngay.
  • Không có quan hệ, hoặc phải tra theo nhiều điều kiện: dùng LOOKUPVALUE. Ví dụ của chính Microsoft là lấy tỷ giá theo hai điều kiện cùng lúc, loại tiền và ngày đặt hàng. Bảng tỷ giá theo ngày khó nối bằng một quan hệ duy nhất, LOOKUPVALUE với hai cặp điều kiện giải quyết gọn.
  • Cột chỉ dùng để lọc hoặc nhóm trên báo cáo: không cần tạo cột. Kéo thẳng cột Nhóm hàng từ bảng SanPham vào biểu đồ, quan hệ tự lọc bảng BanHang. Cột tính thừa làm file nặng thêm, như đã phân tích ở bài Measure và Calculated Column.
  • Muốn cột có sẵn trong bảng dữ liệu trước khi nạp vào mô hình: ghép bảng bằng Power Query, hướng dẫn ở bài Merge Queries thay VLOOKUP.

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

LOOKUPVALUE có giống VLOOKUP không?

Gần với VLOOKUP có tham số FALSE: chỉ khớp chính xác, không có chế độ gần đúng. Khác ở chỗ cột tìm không cần đứng đầu bảng, tra được nhiều điều kiện cùng lúc, và không tìm thấy thì trả trống thay vì #N/A. Các bẫy của VLOOKUP trong Excel có ở bài XLOOKUP và VLOOKUP.

Đã nối hai bảng rồi mà RELATED vẫn báo "doesn't have a relationship"?

Kiểm ba điều theo thứ tự: cột tính đang nằm ở bảng nào (phải ở bảng phía "nhiều"), quan hệ có phải many-to-many không (nhìn ký hiệu * ở cả hai đầu đường nối), và công thức có đang đặt trong measure mà thiếu hàm duyệt từng dòng không.

Có nên bọc IFERROR quanh LOOKUPVALUE?

Không. Tài liệu Microsoft khuyên dùng tham số dự phòng thay cho ISERROR hoặc IFERROR, vì đó là cách ổn định và nhanh nhất. Chỉ cần nhớ tham số này che cả trường hợp trùng mã, như ở mục "Bẫy của giá trị dự phòng".

Học tiếp từ báo cáo thật

Các mô hình nhiều bảng nối với nhau theo đúng kiểu danh mục và bảng giao dịch có thể xem trực tiếp trong 41 báo cáo Power BI mẫu của EzTech. Khóa DATA BUSINESS đi từ dựng mô hình, viết DAX đến hoàn thiện báo cáo quản trị trên Power BI. Doanh nghiệp cần dựng mô hình dữ liệu riêng có thể liên hệ đội ngũ EzTech để được tư vấn.

Chat ZaloGọi điệnMessengerTìm đường