1

私のSPROCでは、#temp1という名前のテーブルに次の列が含まれています。

#temp1 (StoreId, StoreDesc, ReservedQty, AvgPrice, QtyOnHand)

私の質問は次の質問に基づいています

INSERT INTO #temp2 (StoreId, StoreDesc, CommittedQty)
(SELECT     StoreId,  StoreDesc, 
    CASE WHEN ReservedQty > QtyOnHand THEN
        sum(QtyOnHand * AvgPrice) 
    ELSE
        sum(ReservedQty * AvgPrice) 
    END AS CommittedQty
    FROM #temp1 
    GROUP BY StoreId, StoreDesc, QtyOnHand, ReservedQty)

サンプルの結果セットは次のようになります。

StoreId                 StoreDesc   CommittedQty    
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FramersBranch   0
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FarmersBranch   88978
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FarmersBranch   0
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FarmersBranch   3152
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA    Woodlands   5582
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA    Woodlands   389

残念ながら、ステートメントGROUP BYQtyOnHandReservedQty列が必要なCASEため、StoreIdごとに複数の行を取得します。

私が望む次の結果セットを取得できるように、CommittedQtyに基づいて結果を(再び)合計する簡単な方法があるかどうかを知りたいです。

StoreId v               StoreDesc   CommittedQty    
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94    FramersBranch   92130
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA    Woodlands   5971

SELECT別の一時テーブルを使用できることはわかっていますが、ステートメント内でこれを実現するためのより簡単な方法があるかどうか疑問に思いました

4

3 に答える 3

2
SELECT  StoreId,  StoreDesc, 
        SUM(
        CASE
        WHEN ReservedQty > QtyOnHand THEN
                QtyOnHand * AvgPrice 
        ELSE
                ReservedQty * AvgPrice
        END
        ) AS CommittedQty
FROM    #temp1 
GROUP BY
        StoreId, StoreDesc
于 2009-06-02T16:08:26.623 に答える
1

まず最初に:#tempテーブルと## tempテーブルの使用を避けることができる場合は、そうする必要があります。それらは、地球温暖化と鉄砲水を引き起こし、あらゆる種類の温室効果ガスの原因となる邪悪な厄介な小さなものです。(:

冗談は別として、どうしても必要な場合を除いて、一時テーブルを削除し、必要に応じてサブクエリに置き換えます。

このステートメントの周りに別のselectをラップするだけです

INSERT INTO #temp2 (StoreId, StoreDesc, CommittedQty)
SELECT StoreId, StoreDesc, Sum (CommittedQty)
FROM 
(SELECT         StoreId,  StoreDesc, 
        CASE WHEN ReservedQty > QtyOnHand THEN
                sum(QtyOnHand * AvgPrice) 
        ELSE
                sum(ReservedQty * AvgPrice) 
        END AS CommittedQty
        FROM #temp1 
        GROUP BY StoreId, StoreDesc, QtyOnHand, ReservedQty)
)
GROUP BY StoreId, StoreDesc
于 2009-06-02T16:49:33.263 に答える
1

一時テーブルは使用しません。私の推測では、あなたはすでに少なくとも1つは多すぎます:)

CASEステートメント全体の周りにSUMを配置する必要があります。

SUM(AvgPrice *
     CASE
          WHEN ReservedQty > QtyOnHand THEN QtyOnHand
          ELSE ReservedQty
     END)
于 2009-06-02T16:08:29.247 に答える