How to extend the query to add 0 in the cell when no activity is performed

后端 未结 7 1655
甜味超标
甜味超标 2020-12-21 09:57

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

7条回答
  •  -上瘾入骨i
    2020-12-21 10:11

    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 )
    

提交回复
热议问题