Forum Discussion

Devi_AK's avatar
Devi_AK
Frequent Visitor
2 years ago
Solved

Convert DAX query to SQL

Hello,

Can anyne help me to convert the below DAX query to SQL to run it in SSMS?

 

CALCULATE('Req'[Number of Req], 

    FILTER(Req ((RELATED( 'Date1'[ADate])< LASTDATE('Date2'[BDate])  || (RELATED('Date1'[ADate])=LASTDATE('Date2'[BDate]) && RELATED('Time1'[ATime])<=MAX('Time2'[BTime])))    &&

((IF(ISBLANK(RELATED('Date3'[CDate])),RELATED('Date4'[DDate]),RELATED('Date3'[CDate))> FIRSTDATE('Date4'[DDate]) 
                || (IF(ISBLANK(RELATED('Date3'[CDate])),RELATED('Date4'[DDate]),RELATED(('Date3'[CDate]))=FIRSTDATE(('Date4'[DDate]) && IF(ISBLANK(RELATED('Time3'[CTime])),RELATED('Time4'[DTime]),RELATED('Time3'[CTime])>=MIN('Time4'[DTime])))
                || (ISBLANK(RELATED('Time3'[CTime]))
&& ISBLANK(RELATED('Time4'[DTime]))))))))

 

Thank You 🙂

  • I used Apex Refactor to format the SQL. 

     

    SELECT 
        [Number_of_Req] = COUNT([Req].[Number_of_Req])
    FROM
        [Req]
        INNER JOIN [Date1] ON [Req].[Date1ID] = [Date1].[ID]
        INNER JOIN [Date2] ON [Req].[Date2ID] = [Date2].[ID]
        INNER JOIN [Time1] ON [Req].[Time1ID] = [Time1].[ID]
        INNER JOIN [Time2] ON [Req].[Time2ID] = [Time2].[ID]
        LEFT JOIN [Date3] ON [Req].[Date3ID] = [Date3].[ID]
        INNER JOIN [Date4] ON [Req].[Date4ID] = [Date4].[ID]
        LEFT JOIN [Time3] ON [Req].[Time3ID] = [Time3].[ID]
        INNER JOIN [Time4] ON [Req].[Time4ID] = [Time4].[ID]
    WHERE 
        (
              [Date1].[ADate] < (SELECT MAX([Date2].[BDate]) FROM [Date2])
              OR
              (
                  [Date1].[ADate] = (SELECT MAX([Date2].[BDate]) FROM [Date2])
                  AND [Time1].[ATime] <= (SELECT MAX([Time2].[BTime]) FROM [Time2] )
              )
          )
          AND
          (
              (CASE
                   WHEN [Date3].[CDate] IS NULL THEN
                       [Date4].[DDate]
                   ELSE
                       [Date3].[CDate]
               END > (SELECT MIN([Date4].[DDate]) FROM [Date4] )
              )
              OR
              (
                  CASE
                      WHEN [Date3].[CDate] IS NULL THEN
                          [Date4].[DDate]
                      ELSE
                          [Date3].[CDate]
                  END = (SELECT MIN([Date4].[DDate]) FROM [Date4] )
                  AND
                  (
                      CASE
                          WHEN [Time3].[CTime] IS NULL THEN
                              [Time4].[DTime]
                          ELSE
                              [Time3].[CTime]
                      END >= (SELECT MIN([Time4].[DTime]) FROM [Time4] )
                      OR
                      (
                          [Time3].[CTime] IS NULL
                          AND [Time4].[DTime] IS NULL
                      )
                  )
              )
          );

     

    You could also use a CTE 

     

    WITH MaxDate2 AS (
        SELECT MAX([BDate]) AS MaxBDate FROM [Date2]
    ),
    MaxTime2 AS (
        SELECT MAX([BTime]) AS MaxBTime FROM [Time2]
    ),
    MinDate4 AS (
        SELECT MIN([DDate]) AS MinDDate FROM [Date4]
    ),
    MinTime4 AS (
        SELECT MIN([DTime]) AS MinDTime FROM [Time4]
    )
    SELECT 
        COUNT([Req].[Number_of_Req]) AS [Number_of_Req]
    FROM
        [Req]
        INNER JOIN [Date1] ON [Req].[Date1ID] = [Date1].[ID]
        INNER JOIN [Date2] ON [Req].[Date2ID] = [Date2].[ID]
        INNER JOIN [Time1] ON [Req].[Time1ID] = [Time1].[ID]
        INNER JOIN [Time2] ON [Req].[Time2ID] = [Time2].[ID]
        LEFT JOIN [Date3] ON [Req].[Date3ID] = [Date3].[ID]
        INNER JOIN [Date4] ON [Req].[Date4ID] = [Date4].[ID]
        LEFT JOIN [Time3] ON [Req].[Time3ID] = [Time3].[ID]
        INNER JOIN [Time4] ON [Req].[Time4ID] = [Time4].[ID]
    WHERE 
        (
            [Date1].[ADate] < (SELECT MaxBDate FROM MaxDate2)
            OR
            (
                [Date1].[ADate] = (SELECT MaxBDate FROM MaxDate2)
                AND [Time1].[ATime] <= (SELECT MaxBTime FROM MaxTime2)
            )
        )
        AND
        (
            (
                ISNULL([Date3].[CDate], [Date4].[DDate]) > (SELECT MinDDate FROM MinDate4)
            )
            OR
            (
                ISNULL([Date3].[CDate], [Date4].[DDate]) = (SELECT MinDDate FROM MinDate4)
                AND
                (
                    ISNULL([Time3].[CTime], [Time4].[DTime]) >= (SELECT MinDTime FROM MinTime4)
                    OR
                    (
                        [Time3].[CTime] IS NULL
                        AND [Time4].[DTime] IS NULL
                    )
                )
            )
        );

    Can you accept my reply as a solution if it works for you?

     

1 Reply

  • aduguid's avatar
    aduguid
    Memorable Member

    I used Apex Refactor to format the SQL. 

     

    SELECT 
        [Number_of_Req] = COUNT([Req].[Number_of_Req])
    FROM
        [Req]
        INNER JOIN [Date1] ON [Req].[Date1ID] = [Date1].[ID]
        INNER JOIN [Date2] ON [Req].[Date2ID] = [Date2].[ID]
        INNER JOIN [Time1] ON [Req].[Time1ID] = [Time1].[ID]
        INNER JOIN [Time2] ON [Req].[Time2ID] = [Time2].[ID]
        LEFT JOIN [Date3] ON [Req].[Date3ID] = [Date3].[ID]
        INNER JOIN [Date4] ON [Req].[Date4ID] = [Date4].[ID]
        LEFT JOIN [Time3] ON [Req].[Time3ID] = [Time3].[ID]
        INNER JOIN [Time4] ON [Req].[Time4ID] = [Time4].[ID]
    WHERE 
        (
              [Date1].[ADate] < (SELECT MAX([Date2].[BDate]) FROM [Date2])
              OR
              (
                  [Date1].[ADate] = (SELECT MAX([Date2].[BDate]) FROM [Date2])
                  AND [Time1].[ATime] <= (SELECT MAX([Time2].[BTime]) FROM [Time2] )
              )
          )
          AND
          (
              (CASE
                   WHEN [Date3].[CDate] IS NULL THEN
                       [Date4].[DDate]
                   ELSE
                       [Date3].[CDate]
               END > (SELECT MIN([Date4].[DDate]) FROM [Date4] )
              )
              OR
              (
                  CASE
                      WHEN [Date3].[CDate] IS NULL THEN
                          [Date4].[DDate]
                      ELSE
                          [Date3].[CDate]
                  END = (SELECT MIN([Date4].[DDate]) FROM [Date4] )
                  AND
                  (
                      CASE
                          WHEN [Time3].[CTime] IS NULL THEN
                              [Time4].[DTime]
                          ELSE
                              [Time3].[CTime]
                      END >= (SELECT MIN([Time4].[DTime]) FROM [Time4] )
                      OR
                      (
                          [Time3].[CTime] IS NULL
                          AND [Time4].[DTime] IS NULL
                      )
                  )
              )
          );

     

    You could also use a CTE 

     

    WITH MaxDate2 AS (
        SELECT MAX([BDate]) AS MaxBDate FROM [Date2]
    ),
    MaxTime2 AS (
        SELECT MAX([BTime]) AS MaxBTime FROM [Time2]
    ),
    MinDate4 AS (
        SELECT MIN([DDate]) AS MinDDate FROM [Date4]
    ),
    MinTime4 AS (
        SELECT MIN([DTime]) AS MinDTime FROM [Time4]
    )
    SELECT 
        COUNT([Req].[Number_of_Req]) AS [Number_of_Req]
    FROM
        [Req]
        INNER JOIN [Date1] ON [Req].[Date1ID] = [Date1].[ID]
        INNER JOIN [Date2] ON [Req].[Date2ID] = [Date2].[ID]
        INNER JOIN [Time1] ON [Req].[Time1ID] = [Time1].[ID]
        INNER JOIN [Time2] ON [Req].[Time2ID] = [Time2].[ID]
        LEFT JOIN [Date3] ON [Req].[Date3ID] = [Date3].[ID]
        INNER JOIN [Date4] ON [Req].[Date4ID] = [Date4].[ID]
        LEFT JOIN [Time3] ON [Req].[Time3ID] = [Time3].[ID]
        INNER JOIN [Time4] ON [Req].[Time4ID] = [Time4].[ID]
    WHERE 
        (
            [Date1].[ADate] < (SELECT MaxBDate FROM MaxDate2)
            OR
            (
                [Date1].[ADate] = (SELECT MaxBDate FROM MaxDate2)
                AND [Time1].[ATime] <= (SELECT MaxBTime FROM MaxTime2)
            )
        )
        AND
        (
            (
                ISNULL([Date3].[CDate], [Date4].[DDate]) > (SELECT MinDDate FROM MinDate4)
            )
            OR
            (
                ISNULL([Date3].[CDate], [Date4].[DDate]) = (SELECT MinDDate FROM MinDate4)
                AND
                (
                    ISNULL([Time3].[CTime], [Time4].[DTime]) >= (SELECT MinDTime FROM MinTime4)
                    OR
                    (
                        [Time3].[CTime] IS NULL
                        AND [Time4].[DTime] IS NULL
                    )
                )
            )
        );

    Can you accept my reply as a solution if it works for you?