Col 1 Value
--------------
val1 5
val2 45
val3 6
val4 NULL
val5 NULL
val6 65
val7 25
val8 NULL
val9 545
val10 NULL
val11 NULL
val12 NULL
我有这个表,我必须对列Value
中的值求和,但是当Value
为空时,我必须重置总和并从0开始。所以第一个总和必须是56然后是90那么545.我怎么能这样做?感谢
预期结果是一个包含3行且具有以下值56,90,545
的表答案 0 :(得分:2)
<强> SQL DEMO 强>
with cte as (
SELECT *,
COUNT(CASE WHEN [Value] IS NULL THEN 1 END)
OVER (order by [Col 1]) as grp
FROM Table1
)
SELECT SUM(value)
FROM cte
GROUP BY grp
HAVING SUM(value) IS NOT NULL
输出
注意:我必须修复您的数据,以便使用[Col 1]
的值进行排序。 1
到01
。否则,您需要提供一个字段来订购数据,因为数据集没有内在的顺序。
答案 1 :(得分:2)
作为@Juan Carlos Oropeza选项的替代方案,您可以这样做。
保持列名与VAL1,VAL2等相同...... 替换:
OVER (order by [Col 1]) as grp
使用:
OVER (order by CONVERT(INT,SUBSTRING([Col 1],4,10))) as grp
答案 2 :(得分:0)
您可以尝试此查询。它将在值列上创建基于NULL的组。
更新:如果您的[Col 1]是虚拟数据,并且我们没有列可以对数据进行排序。此查询无法保证。
declare @temp table(col1 varchar(50), value int)
insert into @temp values('val1',5)
insert into @temp values('val2',45)
insert into @temp values('val3',6)
insert into @temp values('val4',null)
insert into @temp values('val5',null)
insert into @temp values('val6',65)
insert into @temp values('val7',25)
insert into @temp values('val8',null)
insert into @temp values('val9',545)
insert into @temp values('val10',null)
insert into @temp values('val11',null)
insert into @temp values('val12',null)
select value, 0 as groupNo
into #temp
from @temp
declare @group int = 1
update t
set @group = case when value is not null then @group else @group + 1 end
,groupNo = @group
from #temp as t
select sum(value) as SumValue
from #temp
where value is not null
group by groupNo
drop table #temp