是否可以根据同一条目中的其他列包含值SELECT列?

时间:2012-08-13 14:34:20

标签: sql-server tsql

对标题表示抱歉,不确定我能否轻松/好好地解释这一点。 我继承了一张桌子上的报告(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

我非常愿意重写这一切,并把它推到最有意义的地方,我只是在努力寻找更好的方法(请告诉我这很简单,我刚刚开始它太长了。)

1 个答案:

答案 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)

给予更好的总数。