SQL Somme colonne avant de l'insérer dans #temp
Question
Dans mon SPROC une table nommée # temp1 contient les colonnes suivantes:
#temp1 (StoreId, StoreDesc, ReservedQty, AvgPrice, QtyOnHand)
Ma question est basée sur la requête suivante
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)
Un jeu de résultats de l'échantillon ressemble à ceci:
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
Unfortunatly depuis que je dois GROUP BY
les colonnes QtyOnHand
et ReservedQty
dans ma déclaration CASE
-je obtenir plusieurs lignes pour chaque StoreID.
Je voudrais savoir s'il existe un moyen simple pour moi de résumer les résultats (encore une fois) sur la base CommittedQty afin que je puisse obtenir le jeu de résultats suivant, je désire:
StoreId v StoreDesc CommittedQty
C4ED0D8B-22CF-40FE-8EF9-7FD764310C94 FramersBranch 92130
6369D3A6-83BC-4BB0-9A25-86838CD2B7BA Woodlands 5971
Je me rends compte que je pouvais utiliser une autre table temporaire, mais me demandais s'il y avait un moyen plus facile d'y arriver dans l'instruction de SELECT
La solution
Je ne voudrais pas utiliser une table temporaire. Je pense que vous utilisez déjà au moins un de trop:)
Vous devez mettre la SOMME dans toute votre instruction CASE:
SUM(AvgPrice *
CASE
WHEN ReservedQty > QtyOnHand THEN QtyOnHand
ELSE ReservedQty
END)
Autres conseils
SELECT StoreId, StoreDesc,
SUM(
CASE
WHEN ReservedQty > QtyOnHand THEN
QtyOnHand * AvgPrice
ELSE
ReservedQty * AvgPrice
END
) AS CommittedQty
FROM #temp1
GROUP BY
StoreId, StoreDesc
choses importantes d'abord: Si vous pouvez éviter d'utiliser #temp et ## tables de temp, vous devriez. Ils sont mauvaises choses vilaines petites qui causent le réchauffement climatique et les inondations flash et sont responsables de toutes sortes d'émissions à effet de serre. (:
Blagues à part, à moins qu'il est absolument nécessaire, se débarrasser des tables temporaires et la remplacer par une sous requête si vous devez.
Vous pouvez simplement envelopper une autre autour de choisir cette déclaration
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