我有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特定的技巧。
感谢
答案 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;