2012-10-22 62 views
-2

我有一个product表,我想要得到数量的总和一个领域是不同的状态我怎样才能得到三个函数在不同的状态

这里是我的表...

kind| qty 
1 | 150 
8 | 122 
1 | 177 
3 | 60 
8 | 66 
... 

如何我能得到这个说法

select sum(qty) when kind=1, sum(qty) when kind=8, sum(qty) when kind=3, 
sum1+sum2-sum3 from mytable 

最后一行我想从这句话得到我的SQL计算领域

sum1+sum2-sum3 from mytable 

,其结果将是

sum1 , sum2, sum3, calc 

回答

0

可以按如下方式做到这一点:

SELECT 
sum(CASE kind WHEN 1 THEN qty ELSE 0 END) kind1, 
sum(CASE kind WHEN 0 THEN qty ELSE 0 END) kind8, 
sum(CASE kind WHEN 3 THEN qty ELSE 0 END) kind3, 
sum(CASE kind WHEN 1 THEN qty ELSE 0 END) 
+ sum(CASE kind WHEN 0 THEN qty ELSE 0 END) 
+ sum(CASE kind WHEN 3 THEN qty ELSE 0 END) Total, 
FROM 
    mytable 
1
select 
    sum(case when kind in (1) then qty else 0 end) as sum1, 
    sum(case when kind in (8) then qty else 0 end) as sum2, 
    sum(case when kind in (3) then qty else 0 end) as sum3, 
    sum(case when kind in (1, 8) then qty else -qty end) as calc 
from mytable 
where kind in (1, 3, 8) 
+0

这是真的工作? –

+0

好吧,有一些小问题,但总体来说它的工作 http://sqlfiddle.com/#!6/1dc76/1 –

+0

它产生无效的结果,http://sqlfiddle.com/#!3/41dbc/4 –

2
SELECT kind1, kind8, kind3, (kind1 + kind8 - kind3) totalResult 
FROM 
(
    SELECT SUM(CASE WHEN kind = 1 THEN qty ELSE 0 END) kind1, 
      SUM(CASE WHEN kind = 8 THEN qty ELSE 0 END) kind8, 
      SUM(CASE WHEN kind = 3 THEN qty ELSE 0 END) kind3 
    FROM tableName 
) x 

SQLFiddle Demo

+1

+1:该结构比预先优化“totalResult”的计算更具可维护性。 *(可能会稍微快一点,因为它会循环使用三个聚合,而不是创建第四个聚合。尽管如此,我还是会在子查询中放置一个WHERE子句,以限制只聚合到1,3,8) * – MatBailie