2012-12-13 137 views
3

我可能需要一些SQL語句的幫助。所以,我有表「續」,它看起來像這樣:累積彙總列

cont_id  name  weight 
----------- ---------- ----------- 
1   1   10 
2   1   20 
3   2   40 
4   2   15 
5   2   20 
6   3   15 
7   3   40 
8   4   60 
9   5   10 
10   6   5 

然後我總結了重列,由名稱分組是:

name  wsum 
---------- ----------- 
2   75 
4   60 
3   55 
1   30 
5   10 
6   5 

而結果應該有一個積累柱看起來應該是:

name  wsum  acc_wsum 
---------- ----------- ------------ 
2   75   75 
4   60   135 
3   55   190 
1   30   220 
5   10   230 
6   5   235 

,但我沒能拿到最後的陳述工作..

編輯:此聲明做了(感謝戈登)

select t.*, 
    (select sum(wsum) from (select name, SUM(weight) wsum 
    from cont 
    group by name) 
    t2 where t2.wsum > t.wsum or (t2.wsum = t.wsum and t2.name <= t.name)) as acc_wsum 
from (select name, SUM(weight) wsum 
from cont 
group by name) t 
order by wsum desc 
+0

請顯示您無法工作的語句的代碼。另外,你使用的是什麼數據庫? – dan1111

+0

我剛剛發現[這個答案](http://stackoverflow.com/a/2563940/1771479)對MySQL非常有效。 – agold

回答

3

所以,最好的方式做到這一點正在使用累積和:

select t.*, 
     sum(wsum) over (order by wsum desc) as acc_wsum 
from (<your summarized query>) t 

order by子句進行累加。

如果你不具備這種能力(在SQL Server 2012和Oracle),相關子查詢是一個簡單的方法來做到這一點,假設總結權重是不同的值:

select t.*, 
     (select sum(wsum) from (<your summarized query>) t2 where t2.wsum >= t.wsum) as acc_wsum 
from (<your summarized query>) t 

這應該工作在SQL的所有方言中。要處理累積重量可能有重複的情況:

select t.*, 
     (select sum(wsum) from (<your summarized query>) t2 where t2.wsum > t.wsum or (t2.wsum = t.wsum and t2.name <= t.name) as acc_wsum 
from (<your summarized query>) t 
+0

我得到的錯誤,順序依據在視圖,內聯函數,派生表中是無效的,如果我不說它對象't'是無效的。 – 65756C626F74

+0

選擇噸。*, (選擇從噸T2之和(WSUM)其中t2.name <= t.name)以名稱從大陸 \t基作爲acc_wsum 從( \t選擇名稱,SUM(重量)WSUM \t )t – 65756C626F74

+1

@UlrichFischer。 。 。我很抱歉。按't',我的意思是你的彙總查詢。在大多數數據庫(但不是MySQL)中,您可以使用CTE來表達它,並且只需在查詢中包含一次即可。 –

0

試試這個

;WITH CTE 
AS 
(
SELECT *, 
ROW_NUMBER() OVER(ORDER BY wsum) rownum 
FROM @table1 
) 
SELECT 
c1.name, 
c1.wsum, 
acc_wsum= (SELECT SUM(c2.wsum) 
        FROM cte c2 
        WHERE c2.rownum <= c1.rownum) 
FROM CTE c1; 

,或者你可以加入的,而不是使用子查詢

;WITH CTE 
AS 
(
SELECT *, 
ROW_NUMBER() OVER(ORDER BY usercount) rownum 
FROM @table1 
) 
SELECT 
c1.name, 
c1.wsum, 
acc_wsum= SUM(c2.wsum) 
FROM CTE c1 
INNER JOIN CTE c2 ON c2.rownum <= c1.rownum 
GROUP BY c1.name, c1.wsum; 
+0

我從未使用過公用表表達式。你可以調整你的代碼到表名'cont'嗎? – 65756C626F74