1

在标题上道歉,不确定我能否轻松/很好地解释这一点。我继承了一份从表格运行的报告 (StockMovements)。此表包含产品编号、机芯类型和数量(其中,这三个是重要值)。该报告使用 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

我非常愿意重写整个这一切,并把它从最有意义的地方赶走,我只是在努力寻找一种更好的方法(请告诉我这很简单,我也刚刚开始这样做长)。

4

1 回答 1

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()在 a 中COALESCE()

COALESCE(SUM(CASE WHEN MovementType='StockIn' THEN Quantity END),0)

给出一个更好的总数。

于 2012-08-13T14:39:10.750 回答