插入#temp之前的SQL Sum列

时间:2009-06-02 16:05:30

标签: sql sum group-by

在我的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 BY QtyOnHand&我的ReservedQty语句中的CASE列我为每个StoreId获取了多行。

我想知道是否有一种简单的方法让我根据CommittedQty对结果进行求和(以便再次),这样我就可以获得以下结果集:

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

我意识到我可以使用另一个临时表,但想知道在SELECT语句中是否有更简单的方法来实现这一点

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我不会使用临时表。我的猜测是你已经使用了至少一个太多了:)

您需要将SUM放在整个CASE语句中:

SUM(AvgPrice *
     CASE
          WHEN ReservedQty > QtyOnHand THEN QtyOnHand
          ELSE ReservedQty
     END)

答案 2 :(得分:1)

首先要做的事情:如果你可以避免使用#temp和##临时表,你应该这样做。它们是导致全球变暖和洪水泛滥的邪恶小东西,并且是造成各种温室气体排放的原因。 (:

分开笑话,除非绝对必要,否则摆脱临时表,如果必须,用子查询替换它。

您可以简单地围绕此声明包装另一个选择

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