SQL Sum Column antes de inserir #temp
Pergunta
Na minha SPROC uma tabela chamada # temp1 contém as seguintes colunas:
#temp1 (StoreId, StoreDesc, ReservedQty, AvgPrice, QtyOnHand)
A minha pergunta é baseada na seguinte consulta ??p>
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)
Um conjunto de resultados de amostra esta aparência:
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
Infelizmente já que tenho que GROUP BY
os QtyOnHand
& ReservedQty
colunas na minha declaração CASE
eu recebo várias linhas para cada storeId.
Eu gostaria de saber se existe uma maneira simples para mim, para resumir os resultados (mais uma vez) com base na CommittedQty para que eu possa obter o seguinte conjunto de resultados que desejo:
StoreId v StoreDesc CommittedQty
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94 FramersBranch 92130
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA Woodlands 5971
Eu percebo que eu poderia usar outra tabela temporária, mas se perguntou se havia uma maneira mais fácil de conseguir isso dentro da instrução SELECT
Solução
Eu não usaria uma tabela temporária. Meu palpite é que você já está usando pelo menos um demais:)
Você precisa colocar o SUM em torno de sua declaração CASE todo:
SUM(AvgPrice *
CASE
WHEN ReservedQty > QtyOnHand THEN QtyOnHand
ELSE ReservedQty
END)
Outras dicas
SELECT StoreId, StoreDesc,
SUM(
CASE
WHEN ReservedQty > QtyOnHand THEN
QtyOnHand * AvgPrice
ELSE
ReservedQty * AvgPrice
END
) AS CommittedQty
FROM #temp1
GROUP BY
StoreId, StoreDesc
As primeiras coisas primeiro: Se você pode evitar o uso de tabelas #temp e ## temporários, você deve. Eles são maus desagradáveis ??pequenas coisas que causam o aquecimento global e as inundações flash e são responsáveis ??por todos os tipos de emissões de estufa. (:
Gracejos à parte, a menos que seja absolutamente necessário, se livrar das tabelas temporárias e substituí-lo com uma consulta sub se você tiver que.
Você pode simplesmente embrulhar outra escolha em torno desta declaração
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