Join
比較兩個選擇結果的總和
使用 Firebird,我有兩個表,
Orders
並且DespatchedParts
.
Orders
桌子:ID CustomerID Total_number_parts -- ---------- ------------------ 1 1 5 2 1 4 3 2 10 4 1 5 5 3 20
DespatchedParts
桌子:ID OrdersID PartQty -- -------- ------- 1 1 2 2 1 3 3 2 10 4 3 10 5 3 10
所以在表中,客戶 1 的訂單
Orders
總和為 5+4+5=14。Total_number_parts
然後查看,我們想要客戶 1 的
DespatchedParts
總和,所以 2+3=5。PartQty
因此,客戶 1 訂購了 14 個零件,其中 5 個已發貨。我想獲取所有已收到所有零件的客戶 ID。
以下是我到目前為止所得到的。我不知道把
sum(total_number_parts) = sum(qtyparts)
零件放在哪裡。Select a.customerID, sum(a.Total_number_parts) From Orders a Join (Select sum(PartQty) from OrderParts Group by customerID) B on B.customerID = a.customerID Group By a.CustomerID
您要選擇訂單已完全履行的所有客戶。所以首先你需要知道客戶總共訂購了多少個零件:
select customerid, sum(total_number_parts) ordered from orders group by customerid
您還需要知道為每個客戶運送了多少零件。您將需要加入訂單和已發貨的零件以獲取與已發貨零件關聯的客戶 ID。
select o.customerid, sum(dp.partqty) dispatched from orders o left join dispatched_parts dp on dp.ordersid = o.id group by o.customerid
我在這裡使用左連接,因此如果尚未發送任何元件,您也可以獲得總數量。對於您的問題,這不是必需的,但如果您想獲得所有尚未收到所有零件的客戶,這將變得相關。
我們將這兩者結合起來,並在 where 子句中應用請求的條件:
select a.customerid from ( select customerid, sum(total_number_parts) ordered from orders group by customerid ) a inner join ( select o.customerid, sum(dp.partqty) dispatched from orders o left join dispatched_parts dp on dp.ordersid = o.id group by o.customerid ) b on b.customerid = a.customerid where ordered = dispatched
假設我在評論中建議的更正的 orderids (1, 1, 3, 5, 5),這會產生
customerid 2 3
或者,您可以將第二部分完全移動到 where 子句中,方法是使其成為相關子查詢:
select a.customerid from ( select customerid, sum(total_number_parts) ordered from orders group by customerid ) a where a.ordered = ( select sum(dp.partqty) from orders o left join dispatched_parts dp on dp.ordersid = o.id where o.customerid = a.customerid )