SQL - 带计数的外连接

时间:2013-08-09 01:13:25

标签: sql db2 relational-database outer-join

我有3个文件

  • 订单标题 - 订单#
  • 订单明细 - 详细说明包含产品代码和数量的行 为了#
  • 寄售物品文件 - 寄售产品清单(想想我们销售但由其他人拥有的产品)。并非我们销售的所有产品都是 委托;此文件包含产品主文件的子集。此文件中可能存在重复项,因为密钥是产品+供应商。

我想生成这个结果集:

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特定的技巧。

感谢

1 个答案:

答案 0 :(得分: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;
相关问题