2012-10-22 19 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