1

見出しについてお詫びします。これを簡単に/うまく説明できるかどうかわかりません。テーブル(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

私はこれ全体を書き直して、最も理にかなっているものは何でもそれを追い払うことをいとわないです、私はそれを行うためのより良い方法を見つけるのに苦労しています(それは簡単だと言ってください、そして私もそれを始めたばかりです長さ)。

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()ますCOALESCE()

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

より良い合計を与えるために。

于 2012-08-13T14:39:10.750 に答える