Forum Discussion

JenniferZen's avatar
JenniferZen
Regular Visitor
3 years ago
Solved

DAX for Case statement

Hi,   Can someone please guide me as to how I can implement this case logic in DAX ?   SELECT CASE WHEN WarehouseCode = '---' THEN ISNULL(WarehouseSiteCode,'---') ELSE WarehouseCode END AS Ware...
  • Anonymous's avatar
    Anonymous
    3 years ago

    Here is a working example that (I think) solves your problem.

    Kudos is appreciated if the solution was useful  😀

    Code for reproducing the tables used in the solution is included.

    Steps for creating a summarized table that implements the desired logic for summarizing activites from 2 different tables in Power BI:
    0) Genereate reproducible data:
    Table Warehouse Activity



     

     

     

     

    WarehouseActivity = 
        UNION(
            SELECTCOLUMNS(
                ROW( "WarehouseCodeKey", 1, "WarehouseCode", "A", "WarehouseActivity", 10 ),
                "WarehouseCodeKey", [WarehouseCodeKey],
                "WarehouseCode", [WarehouseCode],
                "WarehouseActivity", [WarehouseActivity]
            ),
            SELECTCOLUMNS(
                ROW( "WarehouseCodeKey", 2, "WarehouseCode", "B", "WarehouseActivity", 20 ),
                "WarehouseCodeKey", [WarehouseCodeKey],
                "WarehouseCode", [WarehouseCode],
                "WarehouseActivity", [WarehouseActivity]
            ),
            SELECTCOLUMNS(
                ROW( "WarehouseCodeKey", 3, "WarehouseCode", "---", "WarehouseActivity", 30 ),
                "WarehouseCodeKey", [WarehouseCodeKey],
                "WarehouseCode", [WarehouseCode],
                "WarehouseActivity", [WarehouseActivity]
            )
        )

     

     

     

     


    Table WareHouseSiteCode


     

     

     

     

    WarehousSiteCode = 
        SELECTCOLUMNS(
            ROW( "WarehouseCodeKey", 3, "WarehouseCode", "---", "WarehouseActivity", 40 ),
            "WarehouseCodeKey", [WarehouseCodeKey],
            "WarehouseCode", [WarehouseCode],
            "WarehouseActivity", [WarehouseActivity]
        )

     

     

     

     

     


    1) In Power BI model view:
    Connect your tables
    - WareHouseActivity and
    - WareHouseSiteCode
    using warehouseCodeKey

     


    2) Add column WarehouseActivityAdjused in table WareHouseActivity based on the sum-logic you described:

     

     

     

     

    WareHouseActivityAdjusted = IF(
                    [WarehouseCode] = "---",
                    LOOKUPVALUE(
                        WarehousSiteCode[WarehouseActivity],
                        WarehousSiteCode[WarehouseCode], "---"
                    ),
                    [WarehouseActivity]
                )

     

     

     

     

     , as shown in snip below:

     

     


    3) Add a summary table that summarizes the data by WareHouseCode

     

     

     

     

    WareHouseActivity summarized = SUMMARIZE(
        WarehouseActivity,
        WarehouseActivity[WarehouseCode],
        "
    WareHouseActivityAdjusted sum
    ", SUM(WarehouseActivity[WareHouseActivityAdjusted])
    )

     

     

     

     

    , as shown in snippet below.


    4) Connect summarized table to datamodel for filtering:
    In order to filter the summarized table using your first table, you can connect them as shown below: 

     

     



    🤺Result:


    First table can be used as slicer /filter:

     

    An equal solution using a simple SQL join and CASE statement is included here:

    # 0) Generate test data
    WITH warehouseActivity AS(
      SELECT 
        1 AS WarehouseCodeKey,
        "A" AS WarehouseCode,
        10 AS WarehouseActivity
      UNION ALL
      SELECT 
        2 AS WarehouseCodeKey,
        "B" AS WarehouseCode,
         20 AS WarehouseActivity
      UNION ALL
      SELECT 
        3 AS WarehouseCodeKey,
        "---" AS WarehouseCode,
        30 AS WarehouseActivity
    ),
    
    WarehousSiteCode AS(
        SELECT 
        3 AS WarehouseCodeKey,
        "---" AS WarehouseCode,
        40 AS WarehouseActivity
    )
    
    # SUM WareHouseActivity by WarehouseCode.
    # If WareHouseCode meet condition, use value from table WarehousSiteCode
    SELECT 
      a.WarehouseCode,
      SUM(
        CASE WHEN a.WarehouseCode="---" THEN b.WarehouseActivity
        ELSE a.WareHouseActivity
        END
      ) AS WarehouseActivity FROM 
      warehouseActivity a  
      LEFT JOIN WarehousSiteCode  b
      ON a.WarehouseCodeKey=b.WarehouseCodeKey 
      GROUP BY WarehouseCode



    JenniferZen 
    Please Accept as Solution if resolved your problem.