SQL-不存在时的总和值

时间:2019-06-03 02:41:00

标签: sql sql-server tsql

我有下表:

RowID Column1 Column2
1       3       2
2       5       2
3       2       9
4       5      NULL
5       8      NULL
6       9       3
7       1      NULL

每当Column2中有一个NULL值时,我都需要Column1的第一行求和。它将继续使逻辑往下排。 因此,结果应如下所示:

RowID Column1 Column2
1       3       2
2       5       2
3       15      9
4       5      NULL
5       8      NULL
6       10      3
7       1      NULL

通知第3行总计2 + 5 + 8 = 15,第6行总计9 + 1 = 10。因此,基本上,Column2中Null值之前的行会累加column1中的值,直到column2中不再有NULL值为止。然后在下一个值为NULL的第6行中恢复。

2 个答案:

答案 0 :(得分:0)

这可以做到。我已经在用于演示的表变量中设置了数据。

declare @t table(RowID int, C1 int, C2 int)
insert @t values (1, 3, 2)
,(2, 5, 2)
,(3, 2, 9)
,(4, 5, NULL)
,(5, 8, NULL)
,(6, 9, 3)
,(7, 1, NULL)

select RowID, sum(C1), max(C2)
from (
select RowID, C1, C2 from @t  
union all
select T1.RowID, T2.C1, null
from @t t1
join @t t2 on t2.RowID>t1.RowID and t2.C2 is null
    and not exists(
        select * from @t t3 
        where t3.RowID>t1.RowID and t3.c2 is not null and t3.RowID<t2.RowID
        )
where T1.C2 is not null
) q group by RowID

结果:

RowID   C1  C2
1       3   2
2       5   2
3       15  9
4       5   NULL
5       8   NULL
6       10  3
7       1   NULL

答案 1 :(得分:0)

我明白了。您需要以相反的顺序查看行,将NULL的值分配给它们之前的值。

这个想法是将一组分配给要累加的行。这是该行后面的非NULL值的数量。这样,您就可以使用窗口函数进行汇总:

select t.*,
       (case when c2 is null then c1
             else sum(c1) over (partition by grp)
        end) as new_c1
from (select t.*, count(c2) over (order by rowid rows between 1 following and unbounded following) as grp
      from t
     ) t
order by rowid;

Here是db <>小提琴。