所以我有一張“訂單”表,里面有所有的訂單,還有這張“發貨”表,每次運送新盒子時都可以節省。它的作業方式是,每次掃描 Box ID 時,表“Ship”都會獲取該 Box ID 并在 Order 表中搜索以獲取要插入的補充資訊,因此兩個表都由 Box ID 鏈接。問題是,“訂單”表有多個重復的 Box ID,因為每一行都是一個單獨的訂單。
我遇到的問題是我需要找到每個 Box ID 有多少訂單,并與“Ship”表中該 Box ID 的數量進行比較,但是當我進行查詢以找出答案時,它重復。
這是訂單的一個例子:
BOX ID ROUTE ACTIVITY
BX00936690000 1 12
BX00936690000 1 12
BX00936690000 1 12
BX00936690000 1 12
BX00936690000 1 12
BX00971770000 2 15
BX00971770000 2 15
Ship 看起來像這樣:
BOX ID ROUTE ACTIVITY TIME
BX00936690000 1 12 15:10:04
BX00936690000 1 12 12:30:20
BX00971770000 2 15 11:50:31
但是,當我嘗試此代碼時:
select OD.BOX_ID, count(OD.BOX_ID) as total_ordered, count(EX.BOX_ID) as total_shipped
from Ship EX
inner join Order OD on (EX.BOX_ID = OD.BOX_ID)
where EX.BOX_ID = OD.BOX_ID
group by OD.BOX_ID
最終結果是這樣的:
BOX ID total_ordered total_shipped
BX00936690000 5 5
BX00971770000 2 2
什么時候應該是這樣的:
BOX ID total_ordered total_shipped
BX00936690000 5 2
BX00971770000 2 1
如何解決這個問題,這樣我才能得到預期的結果?
uj5u.com熱心網友回復:
因為您只想計算已發貨訂單的匹配行,您可以使用相關子查詢,看看以下是否是您需要的:
select o.Box_Id, Count(*) Total_Ordered,
(select Count(*) from Ship s where s.Box_Id=o.Box_Id) total_shipped
from orders o
group by o.Box_Id
uj5u.com熱心網友回復:
您可以使用以下查詢:
select o.box_id, o.total_order_cnt, o.total_ship_cnt
from (
select box_id, count(*) total_order_cnt
from orders o
group by 1
) o
join (
select box_id, count(*) total_ship_cnt
from ships sh
group by 1
) sh
on o.box_id = sh.box_id
uj5u.com熱心網友回復:
您想將訂單數量與發貨數量結合起來。因此,聚合以獲取這些數字,然后加入。
select
box_id,
coalesce(o.total, 0) as ordered,
coalesce(s.total, 0) as shipped
from
(select box_id, count(*) as total from orders group by box_id) o
full outer join
(select box_id, count(*) as total from shipments group by box_id) s using (box_id)
order by box_id;
如果看到保證有出貨一定有訂單,可以把join改成left outer join。如果您只想要同時具有訂單和發貨的盒子,請將其設定為內部連接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/406510.html
標籤:
上一篇:列出SQL查詢中使用的表
下一篇:在Swift中將字典寫入檔案
