I have the following query, it is working fine to show the cricket time played per day. All I need is to show 0 when no cricket is played. At the moment it is skipping those
This is a long query but should give you what you need.. It will also work for multiple activities.
;
WITH CTE
AS ( SELECT email ,
last_update ,
activity ,
starttime ,
endtime ,
duration AS [Totaltime]
FROM users
WHERE activity = 'cricket'
AND email = 'abc'
GROUP BY email ,
activity ,
duration ,
starttime ,
endtime ,
last_update
),
cteSummary
AS ( SELECT activity ,
CAST(starttime AS DATE) AS date ,
SUM(DATEDIFF(second, starttime, endtime)) / 60.0 AS TimePerDay
FROM cte
WHERE starttime >= DATEADD(day, -15, last_update)
GROUP BY activity ,
CAST(starttime AS DATE)
),
cteDateRange
AS ( SELECT activity ,
MIN(date) AS MinDate ,
MAX(date) AS MaxDate
FROM cteSummary
GROUP BY activity
),
cteDateRecur
AS ( SELECT activity ,
CalDate = CONVERT(DATE, MinDate) ,
MaxDate
FROM cteDateRange
UNION ALL
SELECT activity ,
CalDate = DATEADD(DAY, 1, c.CalDate) ,
MaxDate
FROM cteDateRecur c
WHERE c.CalDate < c.MaxDate
)
SELECT d.activity ,
d.CalDate AS date ,
ISNULL(s.TimePerDay, 0) AS TimePerDay
FROM cteDateRecur d
LEFT JOIN cteSummary s ON d.CalDate = s.date
OPTION ( MAXRECURSION 0 )