2015-11-30 40 views
1

的百分比丟失列我有模式的MySQL表如下:單個查詢,以填補在通過計算組總

group id amount fraction 
1  1  3   
1  2  5 
2  3  2 
2  3  1 

每個屬於一個組。每行還存儲一個稱爲amount的特定值。我想找到佔集團總amount每一行都有的部分,因此該表將是這樣的:

AFTER 

group id amount fraction 
1  1  3   .375 
1  2  5   .625 
2  3  2   66.67 
2  3  1   33.33 

要獲得第1列的值,我在第1組總結了所有的amount列。那將是3 + 5,即8。然後我將第1行中的amount除以組合和,得出.375。我爲他們做了這些。通過各組

SELECT SUM(amount) GROUP BY group 

然後循環,選擇排在該組中,計算分數,並更新行:

我可以像這樣寫查詢做到這一點。不幸的是,這意味着在初始查詢之後,我將處理2個嵌套for循環,以及數百萬和數百萬個查詢,這將在數據集的大小的情況下花費很長時間。

我有一種微妙的感覺,有一種方法可以通過一個mysql查詢更高效地執行此操作。如果任何人有任何想法如何使用單個查詢來做到這一點,那是我的問題。

+0

組是一個一個可憐的名字表/列標識符。我想知道你能弄清楚爲什麼? – Strawberry

+0

是的......我只是用它來簡化示例,我實際使用的名稱是不同的。我想這確實會讓答案更難以閱讀! – user3413723

回答

2

您可以用join和聚合爲此在一個查詢:

select t.*, t.amount/tt.sumamount 
from t join 
    (select group, sum(amount) as sumamount 
     from t 
     group by group 
    ) tt 
    on t.group = tt.group; 

編輯:

update頗爲相似:

update t join 
     (select group, sum(amount) as sumamount 
     from t 
     group by group 
     ) tt 
     on t.group = tt.group 
    set fraction = t.amount/tt.sumamount; 
+0

有沒有辦法在命令中加入'update',這樣我就可以保存結果了? – user3413723

+0

令人驚歎的答案!這可能需要我幾天才能弄清楚。 – user3413723

+0

@ user3413723。 。 。練習,練習,練習。 –