2013-11-14 92 views
0

一個項目,我有一個查詢,我彙總數據:MySQL的:每組總和與總

SELECT 
    code, 
    SUM(someValue) as summedValueForCode 
FROM 
    someTable 
GROUP BY 
    code; 

現在,我需要的是第三列定義summedValueForCode代表了所有行的%。所以summedValueForCode/summedValueForAllRows。

我可以這樣做:

SELECT 
    code, 
    SUM(someValue) as summedValueForCode, 
    (100 * SUM(someValue)/(SELECT sum(someValue) FROM someTable)) as valueForCodeToTotal 
FROM 
    someTable 
GROUP BY 
    code; 

但它看起來並不很優雅。

另一種選擇是:

SELECT 
    code, 
    SUM(someValue) as summedValueForCode, 
    (100 * SUM(someValue)/totalSum) as valueForCodeToTotal 
FROM 
    someTable, 
    (SELECT sum(someValue) as totalSum FROM someTable) as summedTable 
GROUP BY 
    code; 

但儘管如此,因爲真正的查詢是相當複雜的,我不喜歡加入查詢一樣,第二次的想法。

是否有一種方法使用聚合函數來計算忽略GROUP的所有行的SUM?

回答

1

在MySQL中沒有這種分析功能。 你將不得不幫助子查詢。

你可以編寫一個UDF來幫助你解決這個問題,但這更加複雜。你將不得不做一些C/C++編程。

退房http://dev.mysql.com/doc/refman/5.1/en/adding-udf.html

不要試圖在MySQL直接實現的功能。它會像地獄一樣緩慢。如果你創建了一個函數,它必須是一個UDF插件。

+0

我擔心的一樣多。感謝您的確認! – Jeroen

0

嗯,有! (如果我真的回答問題的最後一排)

SELECT 
    code, 
    SUM(someValue) as summedValueForCode 
FROM 
    someTable 
GROUP BY 
    code 
WITH ROLLUP # here is where the magic happens 

你會得到這樣的事情作爲輸出

code - summedValueForCode 
    A  100 
    B  200 
    C  50 
null  350 

過濾器用於空的代碼,你會得到總你」重新尋找。

被警告,WITH ROLLUP使用有一定的限制,你可以尋找在official documentation

+0

我知道ROLLUP,但只有在行的末尾纔可以使用......不要在您的示例的3行A,B,C中使用它。感謝您花時間回答,非常感謝! – Jeroen