J'ai rencontré un problème où une CASE
expression ne renvoie pas ce que j'attends.
En tant que test, j'ai ajouté une variable décimale et exécuté la même CASE
expression contre elle et cela fonctionne très bien, renvoyant les résultats comme je m'y attendais (arrondir la valeur quand IsGun=1
. Mais quand je lance cette même CASE
expression contre une autre valeur décimale, elle renvoie toujours la valeur avec la CEILING()
fonction et ne renvoie jamais la valeur d'origine.
Voici le code SQL:
DECLARE @Num decimal(8,2);
set @Num = 12.54;
WITH PQ AS
(
SELECT
UPC,
Price1,
DBID,
AVG(Price1) OVER (PARTITION BY UPC) AS Price1Avg
FROM
vProducts_PriceQty_Union
)
SELECT
PQ.UPC,
PQ.Price1,
PQ.Price1Avg,
(CASE WHEN p.IsGun = 1 THEN CEILING(@Num) ELSE @Num END) AS UsingVar,
CAST(
(CASE WHEN P.IsGun = 1 THEN CEILING(PQ.Price1Avg) ELSE PQ.Price1 END)
AS NUMERIC(8,2))
AS PriceAdj,
PQ.DBID,
P.IsGun
FROM
PQ
INNER JOIN
products P ON PQ.UPC = P.UPC
Voici un extrait des résultats:
UPC Price1 Price1Avg UsingVar PriceAdj DBID IsGun
942000899195 14.9900 14.990000 12.54 15.00 1 0
980420671300 29.9900 29.990000 12.54 30.00 1 0
980420671310 29.9900 29.990000 12.54 30.00 1 0
980426713020 29.9900 29.990000 12.54 30.00 1 0
980426713120 29.9900 29.990000 12.54 30.00 1 0
000998622130 319.0000 319.000000 13.00 319.00 1 1
000998624730 314.0000 314.000000 13.00 314.00 1 1
000998624970 419.0000 419.000000 13.00 419.00 1 1
008244284754 1015.0000 1015.000000 13.00 1015.00 2 1
010633012288 267.0000 267.000000 13.00 267.00 6 1
Et voici les données provenant de vProducts_PriceQty_Union :
UPC Price1 Price2 Quantity DBID
942000899195 14.9900 0.0000 2.00 1
980420671300 29.9900 0.0000 3.00 1
980420671310 29.9900 0.0000 1.00 1
980426713020 29.9900 0.0000 2.00 1
980426713120 29.9900 0.0000 1.00 1
Comme vous pouvez le voir sur les cinq premiers, où IsGun = 0, la première CASE
expression utilisant la variable fixe renvoie la valeur UsingVar comme nous l'attendions, 12,54. Et pour les cinq derniers, il renvoie également la valeur attendue, 13.
Mais dans la deuxième CASE
expression (exactement la même logique), le PriceAdj utilise la CEILING
fonction sur chacun d'eux, que IsGun = 1 ou non.
Pourquoi la requête ne renvoie-t-elle pas les résultats attendus?
Dans certains des tableaux utilisés pour la vue d'ensemble, les types de données pour Price1 et Price2 étaient smallmoney et decimal (8,2) . Depuis, je les ai tous modifiés pour qu'ils soient décimaux (8,2) , mais cela n'a pas affecté les résultats.