question

Rohit25 avatar image
Rohit25 asked

Sql query help needed

Hi The results of the query below ============== Select u.ID ,case when DATEdiff(day, CAST(u.CreatedDATE AS DATE) ,CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) <= 30 Then '1stMonth' when DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) > 30 and DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) <=60 Then '2ndMonth' when DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) > 60 and DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) <=90 Then '3rdMonth' When DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) > 90 and DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) <=120 Then '4thMonth' when DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) > 120 and DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) <=150 Then '5thMonth' When DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) > 150 and DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) <=180 Then '6thMonth' when DATEdiff(day, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(varchar(8), f.DimTktcrtDateKey,112)) ) > 180 Then 'MoreThan6' end Month_Name ,count(*) as count_Ticket from [FactTicket] f join [DimUser] u on f.DimUserKey=u.DimUserKey where f.[DimTktcrtDateKey] >= 20140301 and CAST(u.CreatedDATE AS DATE) BETWEEN '1 Mar 2014' and '31 Mar 2014' and f.FactTicketCurrentStateFlag=1 AND ID=1 group by u.ID,u.CreatedDATE, f.DimTktcrtDateKey is ============== PersonID Month_Name count_Ticket 1 1stMonth 1 1 3rdMonth 1 1 4thMonth 1 1 5thMonth 1 1 6thMonth 1 1 MoreThan6 2 If you see the result Month_Name has no value for 2ndMonth (even if it is 0) Can anyone help me to tune this query in such a way that I get the results for All the month_Names in the case statement above even if it is 0
case-statement
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

1 Answer

·
Tom Staab avatar image
Tom Staab answered
I used a CTE with all of the desired months and then did a left join from that to your data. For future reference, please use the code formatter when including code samples in your question. Thanks. You should just need the first CTE, then wrap your code in the second CTE, and then include the output SELECT statement at the end. As is, you will get null values for 2ndMonth, but you can easily change that with an ISNULL function in the output statement. Please let us know if this helps. WITH ReportMonths AS ( SELECT * FROM (VALUES ('1stMonth'), ('2ndMonth'),('3rdMonth'),('4thMonth'),('5thMonth'),('6thMonth'),('MoreThan6')) t (Month_Name) ) , TicketData AS ( SELECT u.ID AS PersonID , CASE WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE) ,CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) <= 30 THEN '1stMonth' WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) > 30 AND DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) <=60 THEN '2ndMonth' WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE), CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) > 60 AND DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) <=90 THEN '3rdMonth' WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) > 90 AND DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) <=120 THEN '4thMonth' WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) > 120 AND DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) <=150 THEN '5thMonth' WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) > 150 AND DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) <=180 THEN '6thMonth' WHEN DATEDIFF(DAY, CAST(u.CreatedDATE AS DATE),CONVERT(DATE, CONVERT(VARCHAR(8), f.DimTktcrtDateKey,112)) ) > 180 THEN 'MoreThan6' END Month_Name , COUNT(*) AS count_Ticket FROM [FactTicket] f INNER JOIN [DimUser] u ON f.DimUserKey = u.DimUserKey WHERE f.[DimTktcrtDateKey] >= 20140301 AND CAST(u.CreatedDATE AS DATE) BETWEEN '1 Mar 2014' AND '31 Mar 2014' AND f.FactTicketCurrentStateFlag = 1 AND ID = 1 GROUP BY u.ID, u.CreatedDATE, f.DimTktcrtDateKey ) SELECT td.PersonID, rm.Month_Name, td.count_Ticket FROM ReportMonths rm LEFT JOIN TicketData td ON td.Month_Name = rm.Month_Name ORDER BY PersonID, Month_Name ;
10 |1200

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.