在我的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
语句中是否有更简单的方法来实现这一点
答案 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