Data AnalyticsExcel and spreadsheet quality

XLOOKUP with duplicate keys: what your first match hides

PK
Pankit Kumar
Sr. Data Scientist at Parexel (a Goldman Sachs–backed company) · 20 September 2026 · 3 min read
Technically reviewed by Ishaan Sharma
In this article (6 sections)

XLOOKUP can return a valid-looking value from a reference table even when the lookup key is duplicated. Under the default forward search, it returns the first matching entry. If duplicate entries disagree, the worksheet's row order determines the visible answer instead of a business rule.

Check key cardinality before treating the lookup as authoritative. A missing match, one valid match and several matches are different conditions and should remain distinguishable.

Reproduce the ambiguity

Open the synthetic spreadsheet quality workbook. The Customers table contains:

CustomerIDRegion
0012North
0042West
0042East
0789South

Customer IDs are stored as text. On the Clean_Lines sheet, add a RegionLookup column to the Sales table and enter:

excel
=XLOOKUP([@CustomerID],Customers[CustomerID],Customers[Region],"Missing",0)

In a supporting Excel edition, the expected result for 0042 is West because it appears first. Reversing those two reference rows changes the result to East without changing the customer ID or resolving the contradiction.

Microsoft documents XLOOKUP's search and match modes and notes that it is unavailable in Excel 2016 and 2019. These examples target a supporting edition such as Microsoft 365. XLOOKUP function reference.

Count matches before selecting a value

Add a MatchCount column:

excel
=COUNTIF(Customers[CustomerID],[@CustomerID])

Expected counts are one for 0012 and 0789, two for 0042 and zero for 0099. In this fixture, IDs contain only digits as text, so COUNTIF's pattern characters are not relevant. If arbitrary identifiers can contain wildcard characters, choose an exact-comparison counting method or escape them deliberately.

Return a region only when there is exactly one reference row:

excel
=IF([@MatchCount]=0,"Missing customer",IF([@MatchCount]>1,"Ambiguous customer",XLOOKUP([@CustomerID],Customers[CustomerID],Customers[Region],"Missing customer",0)))

Now 0042 is visibly ambiguous and 0099 visibly missing. Neither becomes a fabricated region, and the issue can be routed to whoever owns the customer reference data.

The lab's Python reference check confirms the duplicate key and preserves leading-zero IDs. It does not execute Excel formulas; recalculate and inspect the formula results in your target Excel application before using the workbook operationally.

Duplicate keys are not always duplicate records

Two identical reference rows may be a repeated delivery. Two different regions may reflect a source conflict, or they may be historical versions missing effective-date fields. Those situations require different treatment.

If the table is historical, the lookup needs both customer identity and a date-validity rule. Picking the last row is not a substitute for a properly defined latest or as-of version. A sorted table can also be resorted, so physical row position is fragile evidence of recency.

If several values are legitimately associated with one customer, change the output design. A customer-to-many-interests relationship may require a detail table or explicit aggregation instead of one scalar lookup result.

Preserve types on both sides

The text ID 0012 is not an amount. Converting it to number 12 loses formatting that may be part of its identity. Normalizing one side to numbers while leaving the other as text can create missed matches or collapse distinct identifiers.

Import both key columns under the same documented type and normalization rule. Do not patch a broken join with ad hoc VALUE or TEXT conversions until you understand what was lost during import.

Review the effect on downstream reports

Region-based revenue is unreliable while the 0042 conflict remains unresolved. Overall sales totals may still be valid because the sales lines themselves are intact. Keep ambiguous-region amounts in a visible exception bucket if a provisional report is necessary, and disclose its scope.

Exercise: swap the West and East rows and observe how the unguarded lookup changes. Verify that the guarded formula continues to report ambiguity. Then add a genuinely missing customer and ensure its status differs from the duplicate-key case.

NeuraPath's Data Analytics with Generative AI course connects spreadsheet formulas with data-quality reasoning. A useful lookup project proves key uniqueness and missing-match handling before presenting a clean regional dashboard.

Continue learning

This article is part of the Excel and spreadsheet quality sequence. Use the neighbouring tasks when you need the prerequisite or the next application.

PK
Pankit Kumar
Lead Instructor, NeuraPath Academy

Pankit Kumar has 10 years in Data Science & AI, building and shipping production systems in regulated pharma and clinical environments. He is a freelance trainer at Boston Institute of Analytics, AnalytixLabs and Scaler, and has taught this material to thousands of working professionals.

This article is part of our Data Analytics with Generative AI programme — 3–4 months. The full analyst stack — Excel, SQL, Power BI and Python pipelines — then a generative-AI layer you can prove is right.

Explore Data Analytics with Generative AI
Counselling is free · no obligation

Not sure which programme fits?

Tell us your background and we will map it to the right entry point — including saying so when a cheaper programme is the better fit. A counsellor replies within one working day.