-2

让以下选择为我提供我想要的数据,但我想扩展它,以便对于每个不同的缺陷,返回一行,列表中的 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;

这是当前的输出


产品A 尺寸 560.00

产品A 胶片 40.00

ProductA 处理 10.00

产品 B 尺寸 220.00

产品B 胶片 640.00

ProductB 胶衣 200.00

ProductC 尺寸 60.00

ProductC 薄膜 1160.00

ProductC 垫子缺陷 810.00


我想要返回的内容:


产品A 尺寸 560.00

产品A 胶片 40.00

ProductA 处理 10.00

ProductA 胶衣 0.00

ProductA 垫子缺陷 0.00

产品 B 尺寸 220.00

产品B 胶片 640.00

ProductB 胶衣 200.00

ProductB 处理 0.00

产品B垫缺陷 0.00

ProductC 尺寸 60.00

ProductC 薄膜 1160.00

ProductC 垫子缺陷 810.00

产品C处理 0.00

ProductC 胶衣 0.00


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

对不起,没有时间把这个做得很漂亮。我在这里先向您的帮助表示感谢。

4

1 回答 1

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

于 2012-06-21T03:48:43.037 回答