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

后端 未结 7 1708
甜味超标
甜味超标 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条回答
  •  清歌不尽
    2020-12-21 10:31

    you could try this also :- (this could only for one particular activity)

    Set Nocount On;
    
    Declare  @MinDate   Date
            ,@MaxDate   Date
    
    Declare @test Table
    (
         activity       Varchar(100)
        ,date           Date
        ,TimePerDay     Decimal(5,2)
    )
    
    Declare @result Table
    (
         activity       Varchar(100)
        ,date           Date
        ,TimePerDay     Decimal(5,2) Default 0
    )
    
    ;WITH CTE AS 
    (
        SELECT   email
                ,last_update
                ,activity
                ,starttime
                ,endtime
                ,duration As Totaltime 
        From    users With (Nolock)
        WHERE   activity ='cricket' 
                And email = 'abc'
        GROUP BY email
                ,activity
                ,duration
                ,starttime
                ,endtime
                ,last_update
    )
    
    Insert Into @test(activity,date,TimePerDay)
    Select   activity
            ,Cast(starttime as date) As date
            ,SUM(datediff(second, starttime, endtime))/60.0 As TimePerDay
    From    cte With (Nolock)
    where   starttime >= dateadd(day, -15, last_update)
    group by activity
            ,cast(starttime as date)
    
    Select   @MinDate = Min(Date)
            ,@MaxDate = Max(Date)
    From    @test
    
    ;With AllDates As
    (
        Select   @MinDate As xDate
        From    @test As t1
        Where   t1.date = @MinDate
    
        Union All
    
        Select  Dateadd(Day, 1, xDate)
        From    AllDates As ad
        Where   ad.xDate < @MaxDate
    )
    

    One way is :- (left join)

    Select  'cricket' As activity
            ,ad.xDate
            ,Isnull(t.TimePerDay,0) As TimePerDay
    From    AllDates As ad With (Nolock)
            Left Join @test As t On ad.xDate = t.date
    

    another way is :- (insert with all dates and update)

        Insert Into @result(activity,date)
    Select  'cricket'
            ,ad.xDate
    From    AllDates As ad With (Nolock)
    
    Update  t
    Set     t.TimePerDay = t1.TimePerDay
    From    @result As t
            Join @test As t1 On t.date = t1.date
    
    Select  *
    From    @result As r
    

    output

    enter image description here

    Update

    Declare  @MinDate   Date
            ,@MaxDate   Date
    
    Select   @MaxDate = Getdate()
            ,@MinDate = Dateadd(Day, -14, @MaxDate)
    
    ;With AllDates As
    (
        Select   @MinDate As xDate
    
        Union All
    
        Select  Dateadd(Day, 1, xDate)
        From    AllDates As ad
        Where   ad.xDate < @MaxDate
    )
    
    Select   @activity As activity                      ---- @activity (your stored procedure parameter)
            ,ad.xDate
            ,Isnull(t.TimePerDay,0) As TimePerDay
    From    AllDates As ad With (Nolock)
            Left Join @test As t On ad.xDate = t.date
    

提交回复
热议问题