Forum Discussion

sun-sboyanapall's avatar
sun-sboyanapall
Advocate I
4 years ago
Solved

convert SQL(case) to Dax

Hello guys, 

 

I have this query in sql which I am trying to make a measure in powerbi but having issues,

 

SQL query: 

SELECT COUNT (DISTINCT(ID)) - 

COUNT( DISTINCT (case when MONTH(ISNULL(ConvertedDate,Date_of_Last_Status_Change__c)) <> MONTH(TransactionDate) and Year(ISNULL(ConvertedDate,Date_of_Last_Status_Change__c)) <> YEAR(TransactionDate) then DocumentNumber end))

 

TABLE STRUCTURE

IDTransactionDateConvertedDateDate_of_Last_Status_Change__cDocumentNumber
12312/1/202112/1/202112/15/2021001

145

11/1/202112/1/202112/15/2021002
23410/1/20219/1/202110/21/2021003
265NULL10/1/202110/15/2021NULL
NULL2/1/2021NULLNULL005

 

correct answer:

4 - 2 = 2

 

Thanks for your help!

 

 

  • smpa01's avatar
    smpa01
    4 years ago

    sun-sboyanapall  can you try this measure

     

    Measure =
    CALCULATE (
        DISTINCTCOUNT ( tbl[ID] ),
        VAR _base =
            FILTER (
                tbl,
                tbl[TransactionDate] <> BLANK ()
                    && tbl[ConvertedDate] <> BLANK ()
                    && tbl[Date_of_Last_Status_Change__c] <> BLANK ()
            )
        VAR _left =
            FILTER ( tbl, tbl[ID] <> BLANK () )
        VAR _join =
            EXCEPT (
                _left,
                FILTER (
                    _base,
                    MONTH ( COALESCE ( tbl[ConvertedDate], tbl[Date_of_Last_Status_Change__c] ) )
                        <> MONTH ( tbl[TransactionDate] )
                        && YEAR ( COALESCE ( tbl[ConvertedDate], tbl[Date_of_Last_Status_Change__c] ) )
                            <> YEAR ( tbl[TransactionDate] )
                )
            )
        RETURN
            _join
    )
    

     

8 Replies

  • smpa01's avatar
    smpa01
    Community Champion

    sun-sboyanapall  I don't think the above SQL query returns 2 for the data provided, it returns 4, cause the following part returns 0

    COUNT( DISTINCT (case when MONTH(ISNULL(ConvertedDate,Date_of_Last_Status_Change_c)) <> MONTH(TransactionDate) and Year(ISNULL(ConvertedDate,Date_of_Last_Status_Change_c)) <> YEAR(TransactionDate) then DocumentNumber end))

     

    breakdown

    MONTH(ISNULL(ConvertedDate,Date_of_Last_Status_Change_c)) <> MONTH(TransactionDate) 
    has two matches row 2 and row 3 as {12,11}, {9,10}
    
    Year(ISNULL(ConvertedDate,Date_of_Last_Status_Change_c)) <> YEAR(TransactionDate)
    has no match as all of them are {2021,2021}

     

    • sun-sboyanapall's avatar
      sun-sboyanapall
      Advocate I

      That's correct the correct answer would be 4, I thought I have changed year.

      Looking forward to how you would do this with dax.


      • smpa01's avatar
        smpa01
        Community Champion

        sun-sboyanapall  can you try this measure

         

        Measure =
        CALCULATE (
            DISTINCTCOUNT ( tbl[ID] ),
            VAR _base =
                FILTER (
                    tbl,
                    tbl[TransactionDate] <> BLANK ()
                        && tbl[ConvertedDate] <> BLANK ()
                        && tbl[Date_of_Last_Status_Change__c] <> BLANK ()
                )
            VAR _left =
                FILTER ( tbl, tbl[ID] <> BLANK () )
            VAR _join =
                EXCEPT (
                    _left,
                    FILTER (
                        _base,
                        MONTH ( COALESCE ( tbl[ConvertedDate], tbl[Date_of_Last_Status_Change__c] ) )
                            <> MONTH ( tbl[TransactionDate] )
                            && YEAR ( COALESCE ( tbl[ConvertedDate], tbl[Date_of_Last_Status_Change__c] ) )
                                <> YEAR ( tbl[TransactionDate] )
                    )
                )
            RETURN
                _join
        )
        

         

  • Thank you, another way I did was created a calculated column, is consumed that is taking care of my case statement.

     

    IsConsumed = 
    var yearTranDate = YEAR(Tbl[TransactionDate])
    var monthTranDate = MONTH(Tbl[TransactionDate])
    var yearConvDate = YEAR(Tbl[ConvertedDate]))
    var monthConvDate = MONTH(Tbl[ConvertedDate]))
    var yeardateLastSC = YEAR(Tbl[Date_of_Last_Status_Change__c]))
    var monthdateLastSC = MONTH(Tbl[Date_of_Last_Status_Change__c]))
    
    RETURN  IF(ISBLANK(vLeadConsumedWithSales[ID]), FALSE(), IF(ISBLANK(yearConvDate), yearDateLastSC <> yearTranDate && monthDateLastSC <> monthTranDate, yearConvDate <> yearTranDate && monthConvDate <> monthTranDate))
    • smpa01's avatar
      smpa01
      Community Champion

      sun-sboyanapall  well done.

       

      One rule of thumb to always remember with DAX; if you can create a measure, don't create a column.