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的区别