SQL条件聚合



我正在使用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

相关内容

  • 没有找到相关文章

最新更新