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 WarehouseCode ,
sum(Warehouseactivity) from warehouseActivity wa

left join dbo.warehouse dw on wa.WarehouseCodeKey=dw.WarehouseCodekey

left join dbo.WarehouseSite ws on dw.WarehouseCodekey=ws.WarehouseCodekey

 

Basically what I am doing is to find the sum of the activity based on a warehouse code but if the code is like '---' in the first table then it should look up the value into another table called WarehouseSiteCode to match on the code and return the sum , even if the user has just selected the first table in the filter ?

 

Thanks in advance

  • 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.

9 Replies

  • Anonymous's avatar
    Anonymous
    Not applicable

    HI  ,try below measure

     

     

    In DAX, you can implement the logic from your SQL query using the IF and LOOKUPVALUE functions. Here's an example of how you can write the DAX expression:

     

    less
     
    WarehouseCode = 
    IF (
        'WarehouseActivity'[WarehouseCode] = "---",
        ISNULL (
            LOOKUPVALUE(
                'WarehouseSite'[WarehouseSiteCode],
                'WarehouseSite'[WarehouseCode],
                'WarehouseActivity'[WarehouseCode]
            ),
            "---"
        ),
        'WarehouseActivity'[WarehouseCode]
    )

    JenniferZen

    • JenniferZen's avatar
      JenniferZen
      Regular Visitor

      Hi,

      Thank you for you help!

      I will have to add sum to the final line , right ?

      • Anonymous's avatar
        Anonymous
        Not applicable

        Hi JenniferZen ,

        Yes add sum to the final line.

         

        Please Accept as Solution if resolved your problem.

  • Anonymous's avatar
    Anonymous
    Not applicable

    HI JenniferZen ,

    please share the screenshot of the data you are getting.

    • JenniferZen's avatar
      JenniferZen
      Regular Visitor

      Thank you. Got it working like the Anonymous  suggested. Appreciate all of your inputs 🙂

  • Anonymous's avatar
    Anonymous
    Not applicable

    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.

    • JenniferZen's avatar
      JenniferZen
      Regular Visitor

      Thank you very much for the detailed answer. Really appreciate it! 🙂

      • Anonymous's avatar
        Anonymous
        Not applicable

        Glad hear that the solution worked 🙂