SUBSTITUTEWITHINDEX DAX Function (Table manipulation)

Returns a table which represents the semijoin of two tables supplied and for which the common set of columns are replaced by a 0-based index column. The index is based on the rows of the second table sorted by specified order expressions.

Syntax

SUBSTITUTEWITHINDEX ( <Table>, <Name>, <SemiJoinIndexTable>, <Expression> [, [<Order>] [, <Expression> [, [<Order>] [, … ] ] ] ] )
Parameter Attributes Description
Table
Iterator

Table to be modified.

Name

A name of the column to be added to the first table.

SemiJoinIndexTable

Table that will be ordered and used to calculate index and to join with the first argument.

Expression
Row Context
Repeatable

Order by expression for the second parameter (SemiJoinIndexTable).

Order Optional
Repeatable

The order to be applied. 0/FALSE/DESC – descending; 1/TRUE/ASC – ascending.

Return values

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

A table that includes only those values present in the SemiJoinIndexTable table (similar to an inner join) and which has an index column instead the value column used to join Table with SemiJoinIndexTable.

Remarks

The matching between Table and SemiJoinTable follows the same rules used by other join functions, such as NATURALINNERJOIN and NATURALLEFTOUTERJOIN: the columns must have the same data lineage, or they should both have no data lineage and the same column name. If a column without data lineage has the same name as a column with data lineage, it is ignored for the join condition. If no columns are matched, the function raises an error.

Examples

--  SUBSTITUTEWITHINDEX is a tool function used mainly by
--  Power BI to map values in a query to column in a matrix
--  by substituting the index columns with a number indicating
--  the column number where to put the result.
--  The matching between the two tables is based on data lineage
--  or column names.
DEFINE
    VAR R =
        SUMMARIZECOLUMNS (
            'Product'[Brand],
            'Date'[Calendar Year],
            TREATAS ( { "Contoso", "Fabrikam" }, 'Product'[Brand] ),
            "Amount", [Sales Amount]
        )
    VAR C =
        SUMMARIZE ( Sales, 'Date'[Calendar Year] )
    VAR C_ColumnName =
        SELECTCOLUMNS({"CY 2007", "CY 2008", "CY 2009"}, "Calendar Year", [Value])
    VAR Result =
        SUBSTITUTEWITHINDEX ( R, "Column #", C, [Calendar Year], ASC )

EVALUATE R

EVALUATE C

EVALUATE C_ColumnName

EVALUATE Result

-- The following code would generate an error 
-- because C_ColumnName has the same name
-- of a column with a data lineage
-- EVALUATE
-- SUBSTITUTEWITHINDEX ( R, "Column #", C_ColumnName, [Calendar Year], ASC )

-- The following code works because the 
-- Date[Calendar Year] column loses the data lineage
-- in SELECTCOLUMNS by using an expression
EVALUATE
SUBSTITUTEWITHINDEX ( 
    SELECTCOLUMNS ( 
        R, 
        'Product'[Brand],
        -- the expression remove the data lineage
        "Calendar Year", 'Date'[Calendar Year] & "",
        [Amount]
    ),
    "Column #", C_ColumnName, [Calendar Year], ASC
)

Brand Calendar Year Amount
Contoso CY 2007 2,729,818.54
Fabrikam CY 2007 1,652,751.34
Contoso CY 2008 2,369,167.68
Fabrikam CY 2008 1,993,123.48
Contoso CY 2009 2,253,412.80
Fabrikam CY 2009 1,908,140.91
Calendar Year
CY 2007
CY 2008
CY 2009
Calendar Year
CY 2007
CY 2008
CY 2009
Brand Amount Column #
Contoso 2,729,818.54 0
Fabrikam 1,652,751.34 0
Contoso 2,369,167.68 1
Fabrikam 1,993,123.48 1
Contoso 2,253,412.80 2
Fabrikam 1,908,140.91 2
Brand Amount Column #
Contoso 2,729,818.54 0
Fabrikam 1,652,751.34 0
Contoso 2,369,167.68 1
Fabrikam 1,993,123.48 1
Contoso 2,253,412.80 2
Fabrikam 1,908,140.91 2

Last update: Jan 31, 2023   » Contribute   » Show contributors

Contributors: Alberto Ferrari, Marco Russo, Kenneth Barber

Microsoft documentation: https://docs.microsoft.com/en-us/dax/substitutewithindex-function-dax

2018-2023 © 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.

Iterator

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.

Deprecated

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

Volatile

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

Deprecated

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.

Contribute

Want to improve the content of SUBSTITUTEWITHINDEX? 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.