SQL条件聚合

时间:2015-03-06 18:20:30

标签: sql oracle conditional-aggregation

我正在使用Oracle。

有一张桌子:

Year   Type   Value
2011   1       500
2011   2       550
2011   3       600
...
...
2012   1       600
2012   2       750
2012   3       930

我需要从年份中减去不同类型的所有值。 操作将是:

2011年 - > 1-2-3(500-550-600)

2012年 - > 1-2-3(600-750-930)

对......

结果应该是:

Year   Value
2011   -650  
2012   -1080 
...    ...  

我不能这样做但是在堆栈溢出这个查询被建议了,它起作用了:

select sum(case when type = 1 then value else - value end) as value
from table t
group by year;

但现在,我有另一种情况。我需要做同样的事情但不是1-2-3-4-5 -...但是1 + 2-3-4-5-6 ....

对此我尝试了这两个查询,没有成功:

select sum(case when type = 1 then value when type = 2 then value else - value end) as value
from table t
group by year;

这导致第二个值的值增加了一倍。

select sum(case when type = 1 then value else - value end)+case when type =     2 then value as value
from table t
group by year; 

这导致了正确的类型2值,但是,由于这种类型2在某些年份只有诅咒,其他年份显示为空。因此,最终计算对于类型2(它所在的年份)是正确的,但对于每隔一年,对于每个类型2不存在,它将返回null。

我只是无法让这个查询工作.. 任何想法将不胜感激! 感谢

3 个答案:

答案 0 :(得分:2)

确定数字是应该被视为积极还是消极需要在您的聚合SUM()内发生。所以:

select sum(case when type = 1 OR type = 2 then value else - value end)
from table t
group by year; 

因为你的1 + 2-3-4-5-6 ...公式中1和2都是正数(暗示1是正数),所以你需要OR以确保两者都是正数和其他所有是否定的。然后它将被总结并且你的金色。

答案 1 :(得分:1)

为了完整起见,有两种替代解决方案:

select sum(case when type in (1, 2) then value else -value end)
from t
group by year; 

或者,使用简单的案例表达式:

select sum(case type
             when 1 then value
             when 2 then value
             else -value
           end)
from t
group by year;

答案 2 :(得分:0)

使用sign的短版本:

select year, sum(sign(-type+2.5)*value) from table t group by year