我正在使用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只在某些年份累积,其他年份显示为null。因此,对于类型2(它所在的年份),最终计算是正确的,但对于每隔一年,对于每一个类型2不存在的年份,它都会返回null。
我只是没能让这个查询正常工作。。任何想法都将不胜感激!感谢
需要在聚合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来确保两者都是正数,其他的都是负数。然后它将被总结和你的黄金。
为了完整起见,有两种替代解决方案:
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;
使用sign
的短版本:
select year, sum(sign(-type+2.5)*value) from table t group by year