Join

比較兩個選擇結果的總和

  • January 14, 2018

使用 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
)

引用自:https://dba.stackexchange.com/questions/195193