如何总结两个或更多类似的表

问题描述:

有什么办法可以总结MySQL中两个相似的表的值?如何总结两个或更多类似的表

例如,我有以下两个表:

表1:

id | field1 | field2 | ... | fieldN 
1 | 5 | 6 | ... | 32 
2 | 25 | 5 | ... | 2 
...| ... | ... | ... | ... 
N | 4 | 1 | ... | 30 

表2:

id | field1 | field2 | ... | fieldN 
1 | 4 | 5 | ... | 4 
2 | 2 | 5 | ... | 3 
...| ... | ... | ... | ... 
N | 4 | 5 | ... | 0 

我想使用UNION ALL上表,因为这些表具有相同的字段,接着在每个字段GROUP BY ID上加上一个SUM。

在第一个查询我会得到:

id | field1 | field2 | ... | fieldN 
1 | 5 | 6 | ... | 32 
1 | 4 | 5 | ... | 4 
2 | 25 | 5 | ... | 2 
2 | 2 | 5 | ... | 3 
...| ... | ... | ... | ... 
N | 4 | 1 | ... | 30 
N | 4 | 5 | ... | 0 

...,最后的总和:

id | field1 | field2 | ... | fieldN 
1 | 9 | 11 | ... | 38 
2 | 27 | 10 | ... | 5 
...| ... | ... | ... | ... 
N | 8 | 6 | ... | 30 

有一种替代的方法呢?

+0

不,没有什么可以做你的方式是好的。 – 2013-03-20 18:11:09

+0

如果你有两张类似的表,那么你为什么不把它们合并到一张表中呢? – 2013-03-20 18:19:10

+0

因为它们有不同的目的。第一个表格按月包含特定库存项目的消耗预测,而第二个表格包含按月采购订单中接收的数量。 – gmsantos 2013-03-20 18:30:54

这里有两种选择。

首先是做一个连接,假设它们具有相同的标识:

select t1.id, (t1.field1 + t2.field1) as Field1, . . . 
from t1 join 
    t2 
    on t1.id = t2.id 

你可以,当然,这种改变为left outer join,但你必须在算术运算处理NULL值。

第二个是你的方法:

select id, sum(field1) as Field1, . . . 
from ((select t1.* 
     from t1 
    ) union all 
     (select t2.* 
     from t2 
    ) 
    ) t 
group by id 

你做的是有点偏好的问题。我倾向于认为join会更好地优化(特别是对于正确的索引)。但是,如果两个表中的ID组不同,union all更容易处理这种情况。