我有下表:
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行中恢复。
答案 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 <>小提琴。