Me he encontrado con un problema en el que una CASE
expresión no devuelve lo que esperaba.
Como prueba, agregué una variable decimal y ejecuté la misma CASE
expresión contra ella y funciona bien, devolviendo los resultados como esperaba (redondeando el valor cuando IsGun=1
. Pero cuando ejecuto esa misma CASE
expresión contra otro valor decimal, siempre devuelve el valor con la CEILING()
función y nunca devuelve el valor original.
Aquí está el código 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
Aquí hay un fragmento de los resultados:
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
Y aquí están los datos que provienen 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
Como puede ver en los primeros cinco, donde IsGun = 0, la primera CASE
expresión que usa la variable fija devuelve el valor UsingVar como lo que esperaríamos, 12.54. Y para los últimos cinco, también devuelve el valor que esperaríamos, 13.
Pero en la segunda CASE
expresión (exactamente la misma lógica), PriceAdj usa la CEILING
función en cada una de ellas, independientemente de si IsGun = 1 o no.
¿Por qué la consulta no devuelve los resultados esperados?
En algunas de las tablas utilizadas para la vista de unión, los tipos de datos para Price1 y Price2 eran smallmoney y decimal (8,2) . Desde entonces los he cambiado todos a decimales (8,2) , pero eso no afectó los resultados.
fuente
iif
se expande acase
. Se devuelve el tipo con la mayor prioridad de tipos de datos de las dos opciones. No es posible que ninguna expresión devuelva el tipo de datos X en una fila y el tipo de datos Y en otra fila para la misma columna.