在 MySql 中对 UNION 的结果求和的简单方法

Posted

技术标签:

【中文标题】在 MySql 中对 UNION 的结果求和的简单方法【英文标题】:a simple way to sum a result from UNION in MySql 【发布时间】:2011-01-24 04:04:11 【问题描述】:

我有三个表 (t1,t2,t3) 的并集。 每次重新运行的记录数完全相同,第一列为id,第二列为数量:

1  10
2  20
3  20

1  30
2  30
3  10

1  20
2  40
3  50

有没有simple in sql 的方式来总结一下才得到:

1   60
2   80
3   80

【问题讨论】:

【参考方案1】:
select id, sum(amount) from (
    select id,amount from table_1 union all
    select id,amount from table_2 union all
    select id,amount from table_3
) x group by id

【讨论】:

我正在寻找一种在视图中完成此任务的方法,但视图中不允许子查询。有其他选择吗? 使子查询成为另一个视图【参考方案2】:
SELECT id, SUM(amount) FROM
(
    SELECT id, SUM(amount) AS `amount` FROM t1 GROUP BY id
  UNION ALL
    SELECT id, SUM(amount) AS `amount` FROM t2 GROUP BY id
) `x`
GROUP BY `id`

我将每个表分组并合并,因为我认为它可能会更快,但您应该尝试两种解决方案。

【讨论】:

【参考方案3】:

子查询:

SELECT id, SUM(amount)
FROM ( SELECT * FROM t1
       UNION ALL SELECT * FROM t2
       UNION ALL SELECT * FROM t3
     )
GROUP BY id

【讨论】:

注意:在这种情况下你不应该使用 select *。 注2:我打赌mysql会要求你为子查询分配别名 @David:当然,我的错。如果 id 和 amount 是仅有的两列,可能无关紧要,但是这样的可能性有多大? @zerkms:也是如此。 完全正确。即使现在只有 id 和 amount ,当你在 6 个月内添加第三列时,也没有任何意义... :)【参考方案4】:

不确定 MySQL 是否使用公用表表达式,但我会在 postgres 中这样做:

WITH total AS(
              SELECT id,amount AS amount FROM table_1 UNION ALL
              SELECT id,amount AS amount FROM table_2 UNION ALL
              SELECT id,amount AS amount FROM table_3
             )
SELECT id, sum(amount)
  FROM total

我认为这也应该可以解决问题。

【讨论】:

如前所述。这需要按 id 分组。【参考方案5】:

是的!!!没关系!谢谢!!!! 我的代码整理:

SELECT SUM(total) 
FROM ( 
        (SELECT 1 as id, SUM(e.valor) AS total  FROM entrada AS e)
    UNION 
        (SELECT 1 as id, SUM(d.valor) AS total FROM despesa AS d)
    UNION 
        (SELECT 1 as id, SUM(r.valor) AS total FROM recibo AS r WHERE r.status = 'Pago')
)  x group by id

【讨论】:

以上是关于在 MySql 中对 UNION 的结果求和的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中对行进行求和

在视图mysql中对多选请求的内容求和

在 oracle 中对具有空值的列求和

在 CTE 中对日期范围内的列求和?

mysql union all和union的区别

如何在 pyspark 中对 spark 数据框中的多列求和?