One frequent DAX requirement is to write a formula that behaves like the VLOOKUP function in Excel.
Gehrard Brueckl recently blogged about how to map a date to a fiscal period, when fiscal periods are defined in a separate table, and each period is defined by its start date. Ken Puls recently wrote an article about calculating an effective tax rate with DAX.
In this first post, I will present the LOOKUPVALUE function.
Quick notes about VLOOKUP
VLOOKUP, a classic Excel function, accepts two values (TRUE or FALSE) for its last argument.
Assuming we defined names for Value, Range, i, the formula will look like this:
=VLOOKUP(Value, Range, i, FALSE)
VLOOKUP will look for the first occurrence of Value in the first column of Range. If the value cannot be found, the formula will return #NA, else it will return the value in the i-th column on the same row.
Note that VLOOKUP also works with arrays.
When the last parameter is TRUE (or omitted), then VLOOKUP requires your data to be sorted in ascending order. It will look for the last value in the first column of Range that is not greater than Value, and will return the value in the i-th column on the same row, or #NA if none exists.
DAX V2 introduced a LOOKUPVALUE, that has a related behavior.
A notable difference is that LOOKUPVALUE allows you to provide criteria on several columns. In Excel formulas, this would require you to use concatenate columns, or even replace VLOOKUP with some INDEX/MATCH formula.
The syntax looks like this:
= LOOKUPVALUE( Table[OutputColumn], Table[LookupColumn1], “SearchValue1”, Table[LookupColumn1], “SearchValue2”)
The syntax looks like the vector form of the LOOKUP function, if you put the order of arguments aside. It actually looks like the syntax of the LOOKUPS function, which does not actually exist.
Basically, you first have to define which column contains your output, then define your first lookup column, then provide the value you are looking for, then define your second lookup column, and so on …
LOOKUPVALUE behaves differently from VLOOKUP:
- whereas VLOOKUP works with arrays, LOOKUPVALUE does not work with column expressions. In other words, the columns arguments must reference columns that physically exist in your model. Also, remember that each column must belong to the same table.
- if several rows in your table match your criteria, then VLOOKUP in Excel will only return the first (or last) match. On the contrary, LOOKUPVALUE in DAX may return an error if several rows match your criteria. This will occur if [OutputColumn] does not contain the same value for all matching rows.
- a BLANK value is returned if there is no match.
Also, not surprisingly, you must address columns by names and cannot use indexes to do this.
When to use LOOKUP value?
When your lookup table is a parameter of your model. By that, I mean a static table that you can import in your model.
Obviously, when the behavior described above suits your requirements.
When you want to calculate search values on the fly, or use different search values that come from different tables. In other words, when you cannot use PowerPivot relationships.