我正在使用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。
我只是无法让这个查询工作.. 任何想法将不胜感激! 感谢
答案 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