乘数条件求和SQL

时间:2018-03-15 13:14:05

标签: sql sql-server sum conditional

我的目标是生成生成独立总检查的代码。如下表所示:

column1   Column2   Column3   value   independent total check
A         B         C         10      Null                   
A         B         E         11      Null                   
A         B         total     21      21                    
x         y         z         10      Null                   
x         y         p         20      Null                   
x         y         total     30      30                    

我正在尝试使用条件总和,但没有成功!我现在所拥有的是:

IF OBJECT_ID('tempdb..#Temp') IS NOT NULL DROP Table #Temp
select  t2.Column1, t2.Column2, t2.Column3,t2.value, independanttotal = 
case 
when t2.Column1 ='A' and t2.Column2= 'B'and t2.T_subdesk = 'Total' then sum(t2.value) 
when t2.Column1 ='x' and t2.Column2= 'y'and t2.T_subdesk = 'Total' then sum(t2.value) 
end
into #Temp 
from #Temp_A t2
group by t2.Column1,t2.Column2,t2.Column3,t2.value

但这显然是不正确的,虽然它产生了正确的结果实际上我只是复制了总价值。我需要某种嵌套的总和吗?我是否需要将其分成不同的表格?这真让我很沮丧 感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

你似乎想要:

select t.*,
       sum(case when column3 <> 'total' then value end) over (partition by column1, column2) as independent_total
from #temp t;

这将计算放在所有行上。我不认为这是一个问题,但如果确实存在问题,您可以在case之外使用sum()表达式。

如果您只想在&#34;总计&#34;你可以这样做:

select t.*,
       (case when column3 = 'total'
             then sum(case when column3 <> 'total' then value end) over (partition by column1, column2)
        end) as independent_total
from #temp t;

或者,您稍微简化了逻辑:

select t.*,
       (case when column3 = 'total'
             then sum(value) over (partition by column1, column2) - value
        end) as independent_total
from #temp t;

这将获得两列的总和,然后减去'total'行的值。