将两个SQL查询的结果合并到一个表中,但不使用union。

3
我下面有两个表格,我想产生第三个表格,其中包含按名称分组的进口值和出口值之和。
表名:公司
country | name
canada     a
usa        b 
china      c
france     d

表名:orders

id| importer | exporter | value
23    canada      usa        10  
24     usa        china      50
25    canada      china      10
26    france       usa       40

我可以使用连接(join)的方式分别生成进口总额和出口总额的表格,例如:

进口总额

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
4个回答

5

您需要使用两个全外连接,并基于名称列将它们分别连接起来。

工作查询语句如下:

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上的演示

谢谢,是否有特定的规则来使用子查询?我对SQL不是非常熟悉,但似乎那些连接在形式语句中是一个子查询对吗? - Imran W

3

实际上非常简单,只需要使用以下内容:

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;

0
我会这样解决它:
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,因为这样更容易加入。您可以获得每个国家在其作为进口商或出口商时的价值。然后使用左连接(以不失去任何未显示为进口商或出口商的国家)。


0

请检查这个-

    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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接