SQL Server选择填充行,长度等于零

时间:2012-06-21 03:35:04

标签: sql

让以下select选择给我我想要的数据,但我想扩展它,以便对于每个不同的缺陷,返回一行,列表中的Product具有正确的长度,如果该行不存在则返回零。

这是选择

SELECT Product, Defect, sum(Length) AS Length FROM RejectTransaction  
WHERE  RejectTransaction.TranDate >= '20120620 00:00:00.000' 
AND RejectTransaction.TranDate <= '20120620 23:59:59.000' 
GROUP BY Product, Defect 
ORDER BY Product, Defect;

这是当前的输出


ProductA Dimension 560.00

ProductA Film 40.00

ProductA Handling 10.00

ProductB Dimension 220.00

ProductB Film 640.00

ProductB Gel Coat 200.00

ProductC Dimension 60.00

ProductC Film 1160.00

ProductC Mat缺陷810.00


我想要归还的内容:


ProductA Dimension 560.00

ProductA Film 40.00

ProductA Handling 10.00

ProductA Gel Coat 0.00

产品A垫缺陷0.00

ProductB Dimension 220.00

ProductB Film 640.00

ProductB Gel Coat 200.00

ProductB Handling 0.00

ProductB Mat Defect 0.00

ProductC Dimension 60.00

ProductC Film 1160.00

ProductC Mat缺陷810.00

ProductC Handling 0.00

ProductC Gel Coat 0.00


如果需要,请提供RejectTransaction(上面的数据来自),Product和Defect表。

抱歉,没有时间让这个非常漂亮。感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果你说你有产品和缺陷表,那么LEFT OUTER JOIN应该可以解决问题。

修改 仅包括产品和缺陷的额外要求(拒绝在报告期间引用的交易(我也假设产品和缺陷是独立轴)使问题复杂化,这里CTE的重构节省了我们的时间:

WITH frt AS
(
  SELECT rt.Product, rt.Defect, rt.[Length]
  FROM RejectTransaction rt
  WHERE
   rt.TranDate >= '20120620 00:00:00.000'
   AND rt.TranDate <= '20120620 23:59:59.000'
)
SELECT fp.Product, fd.Defect, SUM(ISNULL(frt.[Length], 0)) AS [Length]
FROM
    (SELECT DISTINCT frt.Product
     FROM frt
     ) AS fp -- Filtered Products
     CROSS JOIN
    (SELECT DISTINCT Defect
      FROM frt
     ) AS fd -- Filtered Defects
     LEFT OUTER JOIN frt  -- Filtered Reject Transaction
     ON frt.Product = fp.Product
     AND frt.Defect = fd.Defect
GROUP BY fp.Product, fd.Defect 
ORDER BY fp.Product, fd.Defect;

完整SQL小提琴: http://www.sqlfiddle.com/#!3/e8b76/2