在 SQL 中,我試圖合并多個表并獲取每個人的費用總和,并首先按最高總費用對這些費用進行排序。我有 3 個表:
- test1(來自雜貨店#1)
- test2(來自雜貨店#2),
- junction1(我剛剛創建的一個以某種方式嘗試將 test1 和 test2 連接在一起)
我無法在生產環境中編輯 test1 和 test2。我創建了 junction1 作為連接 test1 和 test2 的橋梁。我可以修改 junction1 中的列/內容。test1 和 test2 的 ID 將來可能會更改(目前它們是相同的)。
期望的結果:

我需要對所有表進行完全連接,因為我想包括兩個表中的所有人員。test1 和 test2 是獨立的,因為有些人只在 test1 地點購物,有些人只在 test2 地點購物。還要按我嘗試的兩個表的總和排序:
ORDER BY SUM(Grocery1 Grocery2) DESC
沒運氣。
SUM 選擇陳述句(無連接)有效:
select junction1.Name1, SUM(Amount) AS Grocery1
from test1
FULL JOIN junction1 on junction1.ID1= test1.ID1
GROUP BY junction1.Name1 ORDER BY Grocery1 DESC;

但是當我加入表時:
select junction1.Name1, SUM(test1.Amount) AS Grocery1, SUM(test2.Amount) AS Grocery2
from test1
FULL JOIN junction1 ON test1.ID1 = junction1.ID1
FULL JOIN test2 ON test2.ID2 = junction1.ID2
GROUP BY junction1.Name1
它給:

兩列中的資料均已關閉。Andy 在 Grocery1 上應該只有 400 美元。看起來它是乘以而不是相加。我試著除以 3,這有助于一些有 3 個條目的人,但這可能不是我想要的。
uj5u.com熱心網友回復:
我不認為你想要一個完整的加入。如果兩個表可以直接連接在一起,你會的,但我們需要通過連接表的事實改變了情況。
我們可以從聯結表開始,然后是兩個雜貨店表(同時分隔原始列),并在兩個可能的匹配項上union給它們帶來一個。left join最后一步是聚合:
select j.name1, sum(t.amount1) as grocery1, sum(t.amount2) as grocery2
from junction1 j
left join (
select id1, null as id2, amount as amount1, null as amount2 from test1
union all select null, id2, null, amount from test2
) t on t.id1 = j.id1 or t.id2 = j.id2
group by j.name1
使用union可避免您看到的“行乘法”問題。另一方面,無論同一個人是否實際在兩個地點購物,都left join可以確保保留兩個表中的記錄。
uj5u.com熱心網友回復:
Afull join將回傳在 的兩邊都匹配的所有記錄join。這會導致 SQL 為 Andy 回傳多個資料副本。
將查詢更改為使用INNER JOIN,它只會生成匹配的記錄:
SELECT junction1.Name1,
SUM(test1.Amount) AS Grocery1,
SUM(test2.Amount) AS Grocery2
FROM test1
INNER JOIN junction1 ON test1.ID1 = junction1.ID1
INNER JOIN test2 ON test2.ID2 = junction1.ID2
GROUP BY junction1.Name1
uj5u.com熱心網友回復:
現有的答案似乎都在努力計算每家商店的總數,但從您最初的要求來看,聽起來您想要產生每人的總數,而不考慮商店。聽起來聯結表也不是需求的一部分,而是您為解決這個問題而創建的。
有多種方法可以跨兩個表獲取聚合資訊,但正確的解決方案將取決于您必須使用的資料。如果您可以分享更多有關您的源資料的資訊,將會有所幫助:
- test1 是為每個客戶包含一行,還是為客戶的每次購買包含一行?test2 是一樣的嗎?
- 是否有一張表包含可能在任何商店購物的所有客戶的串列,或者客戶是否僅存在于 test1 和 test2 中?
- 你說 id1 和 id2 現在是一樣的,但可能會改變。如果 id 值不再匹配,還有哪些其他資訊可以可靠地將 test1 中的 Andy 連接到 test2 中正確的 Andy 記錄?
當提出這樣的問題時,共享基本模式和一些演示關系模式的示例源資料通常很有幫助,例如:
- 在兩個表中都有行的客戶
- 只有一個表中的行的客戶
- 同一張表中有多行的客戶
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536659.html
