SQL Server 2012在值为null时重置和

时间:2017-11-09 14:59:47

标签: sql sql-server tsql sql-server-2012

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

的表

3 个答案:

答案 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

输出

enter image description here

注意:我必须修复您的数据,以便使用[Col 1]的值进行排序。 101。否则,您需要提供一个字段来订购数据,因为数据集没有内在的顺序。

答案 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