VALUES DAX Function (Table manipulation)

When a column name is given, returns a single-column table of unique values. When a table name is given, returns a table with the same columns and all the rows of the table (including duplicates) with the additional blank row caused by an invalid relationship if present.


VALUES ( <TableNameOrColumnName> )
Parameter Attributes Description

A column name or a table name.

Return values

Table An entire table or a table with one or more columns.

A column of unique values if the parameter is a single column.
If the parameter is a table expression, the result has the same columns and does not remove duplicated rows.


VALUES is similar to DISTINCT, but it can have an additional blank row in case the table has at least one one-to-many relationship with other tables where there is a violation of referential integrity.

» 5 related articles
» 1 related function


--  DISTINCT retrieves the distinct values of a column
--  VALUES does the same.
--  They differ in the way they handle the blank row generated
--  for invalid relationships, if present
--  DISTINCT does not return the blank row caused by an invalid relationship 
--  VALUES includes the blank row caused by an invalid relationship, if present
    "#Stores (no blank row)", COUNTROWS ( DISTINCT ( Store[Store Name] ) ),
    "#Stores (blank row)",    COUNTROWS ( VALUES ( Store[Store Name] ) )
Continent #Stores (no blank row) #Stores (blank row)
North America 209 209
Europe 54 54
Asia 41 41
(Blank) (Blank) 1
--  DISTINCT and VALUES can also be used with a table.
--  DISTINCT returns the distinct rows in the table.
--  VALUES returns the table, with the blank row caused 
--  by an invalid relationship if it exists,
--  but without performing a distinct.
--  Worth remembering that a table reference does not return
--  the blank row caused by an invalid relationship if you 
--  just use the table name.
    "#Stores",                COUNTROWS ( Store ),
    "#Stores (no blank row)", COUNTROWS ( DISTINCT ( Store ) ),
    "#Stores (blank row)",    COUNTROWS ( VALUES ( Store ) )

Continent #Stores #Stores (no blank row) #Stores (blank row)
North America 209 209 209
Europe 54 54 54
Asia 41 41 41
(Blank) (Blank) (Blank) 1
--  DISTINCT can be used with variables.
--  VALUES requires a table or a column that exists in the model.
VAR Stores = 
    SELECTCOLUMNS ( Store, "Continent", Store[Continent] )
        ( "#Stores (all rows)",     COUNTROWS (          ( Stores ) ) ),
        ( "#Stores (no blank row)", COUNTROWS ( DISTINCT ( Stores ) ) )
        --  The following would produce an error: VALUES cannot be used with variables
        -- ( "#Stores (blank row)",    COUNTROWS ( VALUES ( Stores ) ) )
Value1 Value2
#Stores (all rows) 304
#Stores (no blank row) 3

Related articles

Learn more about VALUES in the following articles:

  • Physical and Virtual Relationships in DAX

    DAX calculations can leverage relationships present in the data model, but you can obtain the same result without physical relationships, applying equivalent filters using specific DAX patterns. This article show a more efficient technique to apply virtual relationships in DAX… » Read more

  • Using ALLEXCEPT versus ALL and VALUES

    This article describes the semantic difference between ALLEXCEPT and the joint use of ALL and VALUES, showing practical examples of the different results in Power BI and SSAS 2016. » Read more

  • Blank row in DAX

    There are two functions in DAX that return the list of values of a column: VALUES and DISTINCT. This article describes the difference between the two, explaining the details of the blank row added to tables for invalid relationships. » Read more

  • Using SELECTEDVALUE with Fields Parameters in Power BI

    If you try to use SELECTEDVALUE on the visible column of the table generated by the Fields Parameters feature in Power BI, you get the following error: Calculation error in measure ‘Sales'[Selection]: Column [Parameter] is part of composite key, but… » Read more

  • Understanding blank row and limited relationships

    DAX creates a blank row to guarantee that results are accurate even if a regular relationship is invalid. The blank row is not created for limited relationships. This article shows the effect of not having a blank row in your tables. » Read more

Related functions

Other related functions are:

Last update: Jul 19, 2024   » Contribute   » Show contributors

Contributors: Alberto Ferrari, Marco Russo, Kenneth Barber

Microsoft documentation:

2018-2024 © SQLBI. All rights are reserved. Information coming from Microsoft documentation is property of Microsoft Corp. » Contact us   » Privacy Policy & Cookies

Context Transition

This function performs a Context Transition if called in a Row Context. Click to read more.

Row Context

This expression is executed in a Row Context. Click to read more.


Not recommended

The use of this function is not recommended. See Remarks and Related functions for alternatives.

Not recommended

The use of this parameter is not recommended.


This function is deprecated. Jump to the Alternatives section to see the function to use.


A volatile function may return a different result every time you call it, even if you provide the same arguments. Click to read more.


This parameter is deprecated and its use is not recommended.

DirectQuery compatibility

Limitations are placed on DAX expressions allowed in measures and calculated columns.
The state below shows the DirectQuery compatibility of the DAX function.


Want to improve the content of VALUES? Did you find any issue?
Please, report it us! All submissions will be evaluated for possible updates of the content.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.