2017-01-19 92 views
1

嗨我已经发布了具有一定规律性的报告,但报告值为空时它们具有初始帐户值。 我想为学校,年份和日期创建一个新变量Accts_N,它是该日期的Accts值和日期为空时的Accts值的总和。 因此,使用下面的示例表格,2017学校A 2016-01-10的Accts_N值为8,2016-02-10的值为12。SQL按日期将多个按日期计算的值汇总为新值

School | Year | Accts | ReportDate 
-------|------|-------|----------- 
A  | 2017 | 2  | null 
A  | 2017 | 6  | 2016-01-10 
A  | 2017 | 10 | 2016-02-10 
A  | 2018 | 0  | 2016-01-10 
A  | 2018 | 4  | 2016-02-10 
B  | 2017 | 9  | null 
B  | 2018 | 3  | 2016-2-10 

我已经尝试过几种不同的SUM CASE实例,但我不认为这是正确的做法。有人可以为我提出一个方向吗? 谢谢

回答

0

这个怎么样?

declare @t table(School nvarchar(50), Year datetime, Accts int, ReportDate datetime) 

    insert into @t 
    values 
     ('A','2017',2,null), 
     ('A','2017',6,'2016-01-10'), 
     ('A','2017',10,'2016-02-10'), 
     ('A','2018',0,'2016-01-10'), 
     ('A','2018',4,'2016-02-10'), 
     ('B','2017',9,null), 
     ('B','2018',3,'2016-01-10') 

    select t.School, t.Year, t.ReportDate, t.Accts + ISNULL(tNulls.SumAcctsWhenNull,0) 
    from @t t 
     outer apply (select t2.School, t2.Year, SUM(Accts) AS SumAcctsWhenNull 
        from @t t2 
        where 
         t2.ReportDate IS NULL AND 
         t2.School = t.School AND 
         t2.Year = t.Year 
        group by t2.School, t2.Year) tNulls 
    where 
     t.ReportDate IS NOT NULL 
1

如果你想添加一个新列,那么相关子查询想到:

select r.*, 
     (select sum(r2.accts) 
     from reports r2 
     where r2.school = r.school and 
       r2.year = r.year and 
       (r2.reportdate = r.reportdate or r2.reportdate is null) 
    ) as accts_n 
from reports r;