对标题表示抱歉,不确定我能否轻松/好好地解释这一点。 我继承了一张桌子上的报告(StockMovements)。此表包含产品编号,移动类型和数量(其中,3个是重要值)。 该报告使用ProductMaster表,并针对每个产品编号尝试按产品分组,然后为每个移动类型添加一列,对所有匹配的条目求和。 目前正在做这样的事情:
SELECT PM.ProductNumber,
(SELECT SUM(Quantity) FROM StockMovements WHERE MovementType='StockIn' AND ProductNumber=PM.ProductNumber) AS [StockIn],
(SELECT SUM(Quantity) FROM StockMovements WHERE MovementType='StockOut' AND ProductNumber=PM.ProductNumber) AS [StockOut],
(SELECT SUM(Quantity) FROM StockMovements WHERE MovementType='ClosingStock' AND ProductNumber=PM.ProductNumber) AS [ClosingStock]
FROM ProductMaster AS PM
GROUP BY PM.ProductNumber
这会杀死系统,因为StockMovements是一个庞大的表格,你可以看到它正在为每个产品和每种移动类型进行新的查找。我正在尝试修改存储过程以从ProductNumber分组的StockMovements中驱动SELECT,但我很难看到如何根据MovementType将每个不同的列加起来。 我喜欢的是这样的:
SELECT ProductNumber,
SUM(Quantity) WHERE MovementType='StockIn',
SUM(Quantity) WHERE MovementType='StockOut',
SUM(Quantity) WHERE MovementType='ClosingStock'
FROM StockMovement
GROUP BY ProductNumber
我非常愿意重写这一切,并把它推到最有意义的地方,我只是在努力寻找更好的方法(请告诉我这很简单,我刚刚开始它太长了。)
答案 0 :(得分:3)
关闭。
SELECT ProductNumber,
SUM(CASE WHEN MovementType='StockIn' THEN Quantity END),
SUM(CASE WHEN MovementType='StockOut' THEN Quantity END),
SUM(CASE WHEN MovementType='ClosingStock' THEN Quantity END)
FROM StockMovement
GROUP BY ProductNumber
如果还有其他移动类型,您可能需要考虑添加WHERE
子句以限制您感兴趣的3种类型。
如果某些产品可能没有移动类型的行,您可能希望将SUM()
包裹在COALESCE()
中:
COALESCE(SUM(CASE WHEN MovementType='StockIn' THEN Quantity END),0)
给予更好的总数。