2012-12-12 80 views
2

我想將包含總和(或任何其他操作,如平均值,作爲最後一行)的SQL select查詢添加一行。在這裏它類似於GROUP BY ... WITH ROLLUP。爲每列添加一行總計

開始:比方說,我有一個表字段ID,A,B和C,所有這些都是數字。另外,ID不是唯一的,而是一個類別。我的SELECT查詢應該計算這些數字中有多少屬於指定的範圍。

因此,舉例來說,最終結果將是

(SELECT t.ID, a.ac, b.bc, c.cc FROM t 
LEFT JOIN (SELECT COUNT(*) cc,ID FROM t WHERE A BETWEEN 2 AND 4 GROUP BY ID) AS a ON a.ID=t.ID 
LEFT JOIN (SELECT AVG(B) cc,ID FROM t WHERE B BETWEEN 19 AND 40 GROUP BY ID) AS b ON b.ID=t.ID 
LEFT JOIN (SELECT COUNT(*) cc,ID FROM t WHERE C BETWEEN 12 AND 14 GROUP BY ID) AS c ON a.ID=t.ID GROUP BY t.ID) 

union 

(select 'Overall', 
(SELECT COUNT(*) cc FROM t WHERE A BETWEEN 2 AND 4), 
(SELECT AVG(B) cc FROM t WHERE B BETWEEN 19 AND 40), 
(SELECT COUNT(*) cc FROM t WHERE C BETWEEN 12 AND 14)); 

然而,該方案是不理想的,因爲我需要重新狀態的條件A,B和C.我想知道是否有簡單的方法來完成指定條件的同一個結果只有一次。

在此先感謝。

回答

2

我不認爲有一個更簡單的解決方案。不過,我會重寫你這樣的疑問:

SELECT 
    t.ID, 
    count(case when A between 2 and 4 then ID end), 
    AVG(case when B between 19 and 40 then B end), 
    COUNT(case when C between 12 and 14 then id end) 
FROM t 
GROUP BY ID 
UNION 
select 
    'Overall', 
    count(case when A between 2 and 4 then ID end), 
    AVG(case when B between 19 and 40 then B end), 
    COUNT(case when C between 12 and 14 then id end) 
FROM t 
+0

+1,你可以在第二個整體查詢中做同樣的事情,如果你想使用它,[**這裏是一個demo **](http://sqlfiddle.com/#!2/f7023/1)。 –

+0

@MahmoudGamal謝謝:)我在看到你的評論之前編輯過,不是它與你的演示相同:) – fthiella

2

好了,不平均,你可以這樣做:

SELECT t.ID, 
     count(case when A between 2 and 4 then ID end), 
     AVG(case when B between 19 and 40 then B end), 
     COUNT(case when C between 12 and 14 then id end) 
FROM t 
GROUP BY ID with rollup 

這也是我爲寫:

SELECT t.ID, 
     sum(case when A between 2 and 4 then 1 else 0 end), 
     sum(case when B between 19 and 40 then B end)/sum((case when B between 19 and 40 then B end), 
     sum(case when C between 12 and 14 then 1 else end) 
FROM t 
GROUP BY ID with rollup 

我不知道如何彙總與平均值工作,所以最終版本是:

select coalesce(t.ID, 'Overall'), Acnt, 
     (case when Bcnt > 0 then Bsum/Bcnt end), 
     Ccnt 
from (select t.ID, 
      sum(case when A between 2 and 4 then 1 else 0 end) as Acnt, 
      sum(case when B between 19 and 40 then B end) as Bsum, 
      sum(case when B between 19 and 40 then B end) as Bcnt, 
      sum(case when C between 12 and 14 then 1 else end) as Ccnt 
     FROM t 
     GROUP BY ID with rollup 
    ) t