0

我有 3 个文件

  • 订单标题 - 有订单#
  • 订单详细信息 - 带有产品代码和数量的详细信息行,键入订单#
  • 寄售物品文件 - 寄售产品清单(想想我们销售但归他人所有的产品)。并非我们销售的所有产品都是寄售的;此文件包含产品主文件的子集。此文件中可能有重复项,因为 key 是 product+supplier。

我想产生这个结果集:

Order Number  Order Date  Number of lines     Total Qty     Total Consigned Qty
     1         20130101          5                   10                 5
     2         20130101          4                   20                 0
     3         20130101          7                   41                 20
     4         20130101          1                   66                 66

我的查询看起来像这样(简化)

 SELECT H.OrderNo, H.Date, Count(D.LineNo), Sum(D.ProdQty)
 FROM Header H
 JOIN Detail D ON (H.PO# = D.PO#)        
 WHERE H.DATE > 20130101
 GROUP BY H.PO#, H.Date
 ORDER BY H.PO#, H.Date

报表中的寄售数量表示从明细文件上的产品代码到寄售文件上的产品代码的匹配数乘以明细行上的数量。

我的问题是委托数量,因为我在“详细文件”和“寄售文件”之间存在“一对可能”的关系。我是否需要一个临时表,子选择,每次提取时都需要手动编码?

我正在使用 IBM/DB2 SQL,所以请不要使用 mysql/mssql/oracle 特定的技巧。

谢谢

4

1 回答 1

0

如果我正确理解了这个问题,您只需要一个left outer join

 SELECT H.OrderNo, H.Date, Count(D.LineNo), Sum(D.ProdQty), count(C.ProductCode)
 FROM Header H JOIN
      Detail D
      ON H.PO# = D.PO# LEFT OUTER JOIN
      Consignment C
      on D.ProductCode = C.ProductCode       
 WHERE H.DATE > 20130101
 GROUP BY H.PO#, H.Date
 ORDER BY H.PO#, H.Date;

这会引入所有标题和详细记录,Consignment当没有匹配时,匹配(如果可能)与 NULL 值。

编辑:

处理多个值Consignment

 SELECT H.OrderNo, H.Date, Count(D.LineNo), Sum(D.ProdQty), count(C.ProductCode)
 FROM Header H JOIN
      Detail D
      ON H.PO# = D.PO# LEFT OUTER JOIN
      (select distinct ProductCode
       from Consignment C
      ) C
      on D.ProductCode = C.ProductCode       
 WHERE H.DATE > 20130101
 GROUP BY H.PO#, H.Date
 ORDER BY H.PO#, H.Date;
于 2013-08-09T01:37:21.453 回答