2015-11-30 39 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。 。 。练习,练习,练习。 –