【问题标题】:SQL - Order By Sum of Multiple Tables Sharing Common FieldSQL - 按共享公共字段的多个表的总和排序
【发布时间】:2017-12-26 09:33:13
【问题描述】:

我有 2 个不同的表共享相同的列名。这些表列出了由“id”标识的相同产品。这些产品在两个表格中都有不同的收入,并且在每个表格中多次列出。

我想将 2 个表格中相同产品的收入相加,然后按总和排序。结果是首先对收入最高的产品进行排序。

我尝试了 JOIN 和 UNION,但似乎找不到正确的解决方案。

我尝试过的 UNION 查询...

SELECT id, SUM(rev) as total 
FROM (
        SELECT id, rev FROM table1 UNION ALL
        SELECT id, rev FROM table2 UNION ALL
) 
ORDER BY total DESC

我试过的JOIN查询...

SELECT table1.id, 
       table1.rev, 
       table2.id,
       table2.rev, 
      (table1.rev + table2.rev) as revenue
FROM table1
INNER JOIN table2 ON table1.id = table2.id
ORDER BY revenue DESC

【问题讨论】:

  • 两个表的 ID 和 REV 是否相同?
  • 您使用的是 MySQL 还是 Microsoft SQL Server?请删除不相关的标签。
  • 两个表中的 ID 相同,并且在每个表中列出了多次。 rev 在行上是不同的。
  • mysql,对不起,我删除了另一个

标签: mysql join sql-order-by union


【解决方案1】:

你很亲密。你需要:

  1. 一个 UNION ALL,而不是两个。

  2. 一个 GROUP BY,它给出了中断字段。

  3. 子查询的别名(我使用了 AllRevenue - 您可以使用任何有效的名称。)

SELECT id, SUM(rev) 作为总计 从 ( SELECT id, rev FROM table1 UNION ALL 从表 2 中选择 id、rev ) 作为所有收入 按 ID 分组 按总 DESC 排序

如果您使用 FULL OUTER JOIN,联接方法会起作用,因为某些 id 可能存在于一个表中,而另一个表中不存在,但这通常性能较差。

【讨论】:

    【解决方案2】:

    看起来你只需要在 ID 上分组......除非我错过了什么。

    select d.* from (
    SELECT 
        table1.id, 
        Sum(table1.rev) + Sum(table2.rev) as revenue
    FROM table1
    INNER JOIN table2 ON table1.id = table2.id
    GROUP BY
        table1.id) d
    order by d.revenue
    

    【讨论】:

    • 内连接仅在两个表都具有所有 ID 时才有效。如果任一表中缺少任何一个,则需要一个 FULL 外连接。
    • 是的,@PaulChernoch 确实如此,但 OP 满足了我想将 2 个表中相同产品的收入相加跨度>
    【解决方案3】:
    SELECT id, SUM(rev) as total 
    FROM (
            SELECT id, rev FROM table1 UNION ALL
            SELECT id, rev FROM table2 
    ) 
    GROUP BY id
    ORDER BY total DESC
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。一个正确的解释would greatly improve 其教育价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有类似但不相同的问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多