Search code examples
daxtabular

Dax calculated column


I have a table with OrderNo and ProductCategory. One order can have many order lines. One order can also have different ProductCategories on the lines. The table looks like this:

OrderNo  ProductCategory
O1       Cat1
O1       Cat2
O1       Cat3
O2       Cat1
O3       Cat4

I would like a calculated column "CalcC" that returns 1 if Cat1 exists for an OrderNo. I want the 1 to be returned for all rows with that OrderNo.

My result table would look like this:

OrderNo ProductCategory CalcC
O1      Cat1            1
O1      Cat2            1
O1      Cat3            1
O2      Cat1            1
O3      Cat4            0

If someone can help me achieve this with some DAX syntax, I would be most grateful.

Thank you.


Solution

  • CalcC =
    IF(
        ISEMPTY(
            CALCULATETABLE(
                'FactOrder'
                ,ALLEXCEPT( 'FactOrder', 'FactOrder'[OrderNo] )
                ,'FactOrder'[ProductCategory] = "Cat1"
            )
        )
        ,0
        ,1
    )
    

    IF() is trivial. ISEMPTY() checks whether a table has 0 or >0 rows. CALCULATETABLE() evaluates a table in argument 1 based on the filter context defined in arguments 2-N. ALLEXCEPT() clears context from the named table, preserving it only on named columns.

    Our CALCULATETABLE() returns 'FactOrder' only where [OrderNo] is the same as exists in the calling row context. All filter arguments are combined in a logical and, so in addition to restricting the table to those that share an [OrderNo] with the calling row context, we also restrict it to rows where [ProductCategory] = "Cat1".

    If that table is empty, we return 0, else we return 1.