簡體   English   中英

將兩個 SQL 查詢的結果合並到一個表中,但不合並

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM