Forum Discussion

jesuisbenjamin's avatar
jesuisbenjamin
Icon for Advocate I rankAdvocate I
10 years ago
Solved

Calculate with OR/AND/NOT in filter

It's unclear to me how I can use FILTER() in a CALCULATE() function, and apply an AND / OR / NOT logic.

 

Could you please refer to an existing help page or give examples here below? Thanks.

  • jesuisbenjamin

     

    I’ll give an example as below. Assuming we have a table like below.

     

    If we want to get the total sales of China on July, we can use following formula.

    SalesFromChina_July = 
    CALCULATE (
        SUM ( Table1[Sales] ),
        FILTER ( Table1, AND ( Table1[Country] = "China", MONTH ( Table1[Date] ) = 7 ) )
    )

    If we want to get the total sales of China and USA on July and August, we can use following formula.

    SalesFromChina_OR_USA = 
    CALCULATE (
        SUM ( Table1[Sales] ),
        FILTER ( Table1, OR ( Table1[Country] = "China", Table1[Country] = "USA" ) )
    )

     

    If we want to get the total sales of India on July and August, we can use following formula.

    SalesFromIndia = 
    CALCULATE (
        SUM ( Table1[Sales] ),
        FILTER (
            Table1,
            NOT (
                OR ( Table1[Country] = "China", Table1[Country] = "USA" )
            )
        )
    )

    Best Regards,

    Herbert

6 Replies

  • v-haibl-msft's avatar
    v-haibl-msft
    Icon for Microsoft Employee rankMicrosoft Employee

    jesuisbenjamin

     

    I’ll give an example as below. Assuming we have a table like below.

     

    If we want to get the total sales of China on July, we can use following formula.

    SalesFromChina_July = 
    CALCULATE (
        SUM ( Table1[Sales] ),
        FILTER ( Table1, AND ( Table1[Country] = "China", MONTH ( Table1[Date] ) = 7 ) )
    )

    If we want to get the total sales of China and USA on July and August, we can use following formula.

    SalesFromChina_OR_USA = 
    CALCULATE (
        SUM ( Table1[Sales] ),
        FILTER ( Table1, OR ( Table1[Country] = "China", Table1[Country] = "USA" ) )
    )

     

    If we want to get the total sales of India on July and August, we can use following formula.

    SalesFromIndia = 
    CALCULATE (
        SUM ( Table1[Sales] ),
        FILTER (
            Table1,
            NOT (
                OR ( Table1[Country] = "China", Table1[Country] = "USA" )
            )
        )
    )

    Best Regards,

    Herbert

    • Zowie-Thurlow's avatar
      Zowie-Thurlow
      Frequent Visitor

      This is very useful. However, I am trying to apply different targets to different months based on last years totals. So if month is September then add 70% to last years total, if month is October then 80 % to last year etc, then the months after that should be the same as last year. I have looked everywhere and cannot find the logic to do this. Any help would be great 

    • ukare1996's avatar
      ukare1996
      Icon for Helper I rankHelper I
      Hi, can someone please help me understand why my query is not working as it should be? I am trying to Count number of rows where the field is not equal to "None" and Blanks are not counted in. The query below seems to only take into account one of the filters.
       
      Monitor 1 - Action taken by customer =
          CALCULATE(
              COUNT('Network protection '[Monitor 1 - Action taken by customer]),
                  FILTER('Network protection ', OR('Network protection'[Monitor 1 - Action taken by customer] <> "None", NOT(ISBLANK('Network protection' [Monitor 1 - Action taken by customer])))))
  • MattAllington's avatar
    MattAllington
    Icon for Community Champion rankCommunity Champion

    To do an AND, you should create 2 filter statements, one for each.

     

    =CALCULATE([measure],filter(),filter())

     

    for an OR, do it like this

     

    =CALCULATE([measure],filter(table,table[col1] = "X" || table[col2] = "Y"))

    note this is not overly efficient, but it is how you do it. (working on 2 columns at once can be inefficient.

     

    for NOT, you can use teh NOT() function around your tests

     

    Hope that helps