Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

To celebrate FabCon Vienna, we are offering 50% off select exams. Ends October 3rd. Request your discount now.

Reply
a119526
Frequent Visitor

Switch statement with two independent selected values

Hi - 

 

I am putting together a PVM analysis that currently compares Year-Over-Year variances for certain products. I want to add an additional selection box (similar to Sales Type in the top right) that will allow a user to select YTD, MoM, YoY to update the value we are comparing against. 

 

I included my current formula for Sales LY below the image. Can I update this formula to include an additional SELECTEDVALUE statement that will also look at the YoY,YTD,MoM selection and then calculate the starting point (sameperiodlastyear, endofmonth(previousmonth), etc.)?

 

 

 

a119526_0-1628184348479.png

 
Sales LY =

VAR Selection = SELECTEDVALUE('Sales Type'[Sales Type])
RETURN

SWITCH(TRUE(),
Selection = "Contract Sales",CALCULATE(SUM('SAP Sales Daily'[Contract_Sales]),SAMEPERIODLASTYEAR('Date'[Date])),
Selection = "Invoice Sales",CALCULATE(-SUM('SAP Sales Daily'[Gross_Sales]),SAMEPERIODLASTYEAR('Date'[Date])),
Selection = "WAC Sales", CALCULATE(SUM('SAP Sales Daily'[Wac_Sales]),SAMEPERIODLASTYEAR('Date'[Date]))
)
8 REPLIES 8
AlexisOlson
Super User
Super User

This is probably a good use case for Calculation Groups but you can probably get away with those with some SWITCH functions.

 

Something like this perhaps:

Sales LY =
VAR SalesType = SELECTEDVALUE ( 'Sales Type'[Sales Type] )
VAR PeriodType = SELECTEDVALUE ( 'Period Type'[Period Type] )
VAR PeriodDates =
    SWITCH (
        PeriodType,
        "LY", SAMEPERIODLASTYEAR ( 'Date'[Date] ),
        "YTD", DATESYTD ( 'Date'[Date] )
        /* Add more cases as desired. */
    )
RETURN
    CALCULATE (
        SWITCH (
            SalesType,
            "Contract Sales", SUM ( 'SAP Sales Daily'[Contract_Sales] ),
            "Invoice Sales", - SUM ( 'SAP Sales Daily'[Gross_Sales] ),
            "WAC Sales", SUM ( 'SAP Sales Daily'[Wac_Sales] )
        ),
        PeriodDates
    )

Thanks for  your response Alex.

 

I put together the following DAX, but am getting an error. 

"The True/False expression does not specify a column. Each True/False expressions used as a table filter expression must refer to exactly one column."

Sales LY test =

VAR SelectionSales = SELECTEDVALUE('Sales Type'[Sales Type])
VAR DateType = SELECTEDVALUE('Date Type'[Date Type])
VAR Dates =
SWITCH(DateType,
"YTD",ENDOFYEAR(PREVIOUSYEAR('Date'[Date])),
"MoM",PREVIOUSMONTH('Date'[Date]),
"YoY",SAMEPERIODLASTYEAR('Date'[Date])
)

RETURN
CALCULATE(
SWITCH(SelectionSales,
"Contract Sales",CALCULATE(SUM('SAP Sales Daily'[Contract_Sales])),
"Invoice Sales",CALCULATE(-SUM('SAP Sales Daily'[Gross_Sales])),
"WAC Sales", CALCULATE(SUM('SAP Sales Daily'[Wac_Sales])))
,Dates)
 

Hmm. It looks like it isn't recognizing the Dates variable as a table argument. Does it help at all if you wrap each of the Dates cases with CALCULATETABLE, e.g. "MoM", CALCULATETABLE ( PREVIOUSMONTH ( 'Date'[Date ) ), and/or move the Dates argument inside each SelectionSales case instead of the outside?

Unfortunately neither worked. 

 

The top section before the RETURN works as expected, but the second SWITCH does not want to work with the 'DATES' filter. I also tried creating a different measure and using that as a filter, that didn't work either.

 

I wonder if I can do a series of IF statements? 

Ok, I think I figured it out. Probably not the most elegant solution, but it works.

Sales LY test = 

VAR SelectionSales = SELECTEDVALUE('Sales Type'[Sales Type])
VAR DateType = SELECTEDVALUE('Date Type'[Date Type])

RETURN
IF(DateType = "YTD",
        SWITCH(SelectionSales,
        "Contract Sales",CALCULATE(SUM('SAP Sales Daily'[Contract_Sales]),ENDOFYEAR(PREVIOUSYEAR('Date'[Date]))),
        "Invoice Sales",CALCULATE(-SUM('SAP Sales Daily'[Gross_Sales]),ENDOFYEAR(PREVIOUSYEAR('Date'[Date]))),
        "WAC Sales", CALCULATE(SUM('SAP Sales Daily'[Wac_Sales]),ENDOFYEAR(PREVIOUSYEAR('Date'[Date])))),
IF(DateType = "MoM",
        SWITCH(SelectionSales,
        "Contract Sales",CALCULATE(SUM('SAP Sales Daily'[Contract_Sales]),ENDOFMONTH(PREVIOUSMONTH('Date'[Date]))),
        "Invoice Sales",CALCULATE(-SUM('SAP Sales Daily'[Gross_Sales]),ENDOFMONTH(PREVIOUSMONTH('Date'[Date]))),
        "WAC Sales", CALCULATE(SUM('SAP Sales Daily'[Wac_Sales]),ENDOFMONTH(PREVIOUSMONTH('Date'[Date])))),
IF(DateType = "YoY",
        SWITCH(SelectionSales,
        "Contract Sales",CALCULATE(SUM('SAP Sales Daily'[Contract_Sales]),ENDOFMONTH(SAMEPERIODLASTYEAR('Date'[Date]))),
        "Invoice Sales",CALCULATE(-SUM('SAP Sales Daily'[Gross_Sales]),ENDOFMONTH(SAMEPERIODLASTYEAR('Date'[Date]))),
        "WAC Sales", CALCULATE(SUM('SAP Sales Daily'[Wac_Sales]),ENDOFMONTH(SAMEPERIODLASTYEAR('Date'[Date]))))
)))

Yeah, worst case you have to define all 9 possibilities. I think I could get something like my initial suggestion working but it would take some tinkering.

 

If you do go with 9 cases, you can also do it without nesting like this:

Sales LY test =
VAR SelectionSales = SELECTEDVALUE ( 'Sales Type'[Sales Type] )
VAR DateType = SELECTEDVALUE ( 'Date Type'[Date Type] )
RETURN
    SWITCH (
        TRUE (),
        DateType = "YTD" && SelectionSales = "Contract Sales",
            CALCULATE (
                SUM ( 'SAP Sales Daily'[Contract_Sales] ),
                ENDOFYEAR ( PREVIOUSYEAR ( 'Date'[Date] ) )
            ),
        DateType = "YTD" && SelectionSales = "Invoice Sales",
            CALCULATE (
                - SUM ( 'SAP Sales Daily'[Gross_Sales] ),
                ENDOFYEAR ( PREVIOUSYEAR ( 'Date'[Date] ) )
            ),
        DateType = "YTD" && SelectionSales = "WAC Sales",
            CALCULATE (
                SUM ( 'SAP Sales Daily'[Wac_Sales] ),
                ENDOFYEAR ( PREVIOUSYEAR ( 'Date'[Date] ) )
            ),
        DateType = "MoM" && SelectionSales = "Contract Sales",
            CALCULATE (
                SUM ( 'SAP Sales Daily'[Contract_Sales] ),
                ENDOFMONTH ( PREVIOUSMONTH ( 'Date'[Date] ) )
            ),
        DateType = "MoM" && SelectionSales = "Invoice Sales",
            CALCULATE (
                - SUM ( 'SAP Sales Daily'[Gross_Sales] ),
                ENDOFMONTH ( PREVIOUSMONTH ( 'Date'[Date] ) )
            ),
        DateType = "MoM" && SelectionSales = "WAC Sales",
            CALCULATE (
                SUM ( 'SAP Sales Daily'[Wac_Sales] ),
                ENDOFMONTH ( PREVIOUSMONTH ( 'Date'[Date] ) )
            ),
        DateType = "YoY" && SelectionSales = "Contract Sales",
            CALCULATE (
                SUM ( 'SAP Sales Daily'[Contract_Sales] ),
                ENDOFMONTH ( SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
            ),
        DateType = "YoY" && SelectionSales = "Invoice Sales",
            CALCULATE (
                - SUM ( 'SAP Sales Daily'[Gross_Sales] ),
                ENDOFMONTH ( SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
            ),
        DateType = "YoY" && SelectionSales = "WAC Sales",
            CALCULATE (
                SUM ( 'SAP Sales Daily'[Wac_Sales] ),
                ENDOFMONTH ( SAMEPERIODLASTYEAR ( 'Date'[Date] ) )
            )
    )

Thanks so much for this. 

Just curious, would this solution perform better than the nested IF statements? They both give the same answers.

I'd expect them to be about the same but can't say for sure.

 

The reason I'd consider it has more to do with the fact that nested logic tends to be a bit more difficult to read, in general. I prefer to not be mentally matching parentheses if I don't have to.

Helpful resources

Announcements
September Power BI Update Carousel

Power BI Monthly Update - September 2025

Check out the September 2025 Power BI update to learn about new features.

August 2025 community update carousel

Fabric Community Update - August 2025

Find out what's new and trending in the Fabric community.

Top Solution Authors