SQL - 使用 Union All 和 Join 计算

Posted

技术标签:

【中文标题】SQL - 使用 Union All 和 Join 计算【英文标题】:SQL - Calculation with Union All and Join 【发布时间】:2017-07-25 18:02:34 【问题描述】:

我有 3 个 SQL 表,每个供应商一个。所有表都有 3 个相同的列:(id)、(spend) 和 (date)。 (id) 代表产品编号。 (花费)是他们在产品上花费了多少。以及交易的(日期)。

感谢 ***,我能够按每个产品 (id) 的总支出(包括所有表格)进行排序。这是有效的 UNION ALL 语句:

SELECT id, SUM(spend) as total
                    FROM (
                        SELECT id, spend, date 
                        FROM vendor1 
                        WHERE date BETWEEN '$dateStart' AND '$dateEnd'
                        UNION ALL
                        SELECT id, spend, date 
                        FROM vendor2
                        WHERE date BETWEEN '$dateStart' AND '$dateEnd'
                        UNION ALL
                        SELECT id, spend, date 
                        FROM vendor3
                        WHERE date BETWEEN '$dateStart' AND '$dateEnd'
                    ) as SpendTotal  
                    GROUP BY id 
                    ORDER BY total DESC

现在我想在 SQL 公式中加入一个新表 (revTbl),该表列出了从每个产品 (id) 中获得的收入。第 4 个表与上面提到的 3 个具有相同的列 (id)。它也有相同的(日期)列。但是,此表有一个名为 (rev) 的不同列。

我想编写一个按 SUM(rev)-SUM(spend) 排序的 SQL 语句。我尝试将它包含为 UNION ALL 但没有运气,在阅读了 UNION ALL 之后我明白了原因。我猜我需要加入一个 JOIN 语句,但不知道从哪里开始。请帮我编写正确的 SQL 语句。

【问题讨论】:

【参考方案1】:

您可以创建两个子查询并通过 Id 加入它们。像这样的:

Select rev.id, total_rev - rev_total as result from 
      (SELECT id, SUM(rev) as total_rev
                    FROM rev
                    GROUP BY id) as rev
join  (SELECT id, SUM(spend) as spend_total
                    FROM (
                        SELECT id, spend, at 
                        FROM vendor1 
                        UNION ALL
                        SELECT id, spend, at
                        FROM vendor2
                        UNION ALL
                        SELECT id, spend, at
                        FROM vendor3
                    ) as SpendTotal
                    GROUP BY id) as spend on spend.id = rev.id order by result;

为简单起见,我从您的 sql 中删除了条件。还将“日期”列名更改为“在”,因为据我所知,日期是 sql 数据类型。

【讨论】:

您遇到错误了吗?或者它返回了意想不到的结果?

以上是关于SQL - 使用 Union All 和 Join 计算的主要内容,如果未能解决你的问题,请参考以下文章

sql union和union all的用法及效率 以及与join的区别

sql中用union all最多可以合并几个表

sql语句or与union all的执行效率哪个更高

MYSQL06_sql99的7种JOIN操作union all

UNION ALL

HIVE优化(四)-union all