[英]Combining the results of two SQL queries into one table but not with a union
我在下面有两个表,我想生成第三个表,其中包含按名称分组的进口值和出口值的总和。
表名:公司
country | name
canada a
usa b
china c
france d
表名:订单
id| importer | exporter | value
23 canada usa 10
24 usa china 50
25 canada china 10
26 france usa 40
我可以使用连接分别生成导入表和导出表的总和,例如:
进口商总数
select name, sum(value)
from orders
full outer join companies
on orders.importer = companies.country
我想看到一个表格,结合了按名称分组的进口总额和出口总额。 进口总和和出口总和是订单表中值列的总和。 我很困惑我是否必须在这里使用子查询。
示例表
Name | sum of importer | sum of exporter
a 20 0
b 50 50
c 0 60
d 40 0
为此,您需要分别使用两个full outer join
并根据name
列连接它们。
工作查询是:
select g1.name, g1.sumofimporter, g2.sumofexporter
from (
select c.name
,COALESCE(sum(o1.value), 0) as sumofimporter
from companies c
full outer join orders o1 on o1.importer = c.country
group by c.name
) g1
join (
select c.name
,COALESCE(sum(o2.value), 0) as sumofexporter
from companies c
full outer join orders o2 on o2.exporter = c.country
group by c.name
) g2 on g2.name = g1.name
order by g1.name
注意:由于这篇文章是关于 postgresql 的,但我在 SQL Server 上创建了一个工作演示用于测试目的。
请在 db<>fiddle 上找到演示
'''其实很简单..用下面的——
select c.name, IFNULL(sum(i.value),0) as sum_of_imports, IFNULL(sum(e.value),0) as sum_of_exports from companies c
Left join orders i on c.country = i.importer
Left join orders e on c.country = e.exporter
group by c.name
order by c.name asc;
检查这个-
SELECT A.name,A.sum_of_importer,COALESCE(SUM(O2.value),0) sum_of_exporter
FROM
(
SELECT C.name,C.country,COALESCE(SUM(Value),0) AS sum_of_importer
FROM Companies C
LEFT JOIN orders O ON C.country = O.importer
GROUP BY C.name,C.country
)A
LEFT JOIN orders O2 ON A.country = O2.exporter
GROUP BY A.name,A.sum_of_importer
ORDER BY 1
我会这样解决:
WITH importer AS (SELECT orders.importer, SUM(orders.value) AS t_import
FROM orders
GROUP BY 1),
exporter AS (SELECT orders.exporter, SUM(orders.value) AS t_export
FROM orders
GROUP BY 1)
SELECT c.name, COALESCE(i.t_import, 0) sum_of_import, COALESCE(e.t_export, 0) sum_of_export
FROM company c
LEFT JOIN importer i ON c.country = i.importer
LEFT JOIN exporter e ON c.country = e.exporter
这给了我:
name | sum_of_import | sum_of_export
a 20 0
b 50 50
c 0 60
d 40 0
规划时间:0.157 毫秒
执行时间:0.120 毫秒
我的想法:我决定把它分成两个不同的 CTE,因为这样更容易加入。 您可以获得每个国家作为进口商或出口商的价值。 然后使用左连接(以免丢失任何未显示为进口商或出口商的国家/地区)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.