我遇到了一个问题,就是CASE
表达式无法返回我期望的结果。
作为测试,我添加了一个十进制变量并对它运行相同的CASE
表达式,它运行良好,返回的结果与我期望的一样(将值四舍五入IsGun=1
。但是当我CASE
对另一个十进制值运行相同的表达式时,它总是返回CEILING()
函数的值,并且永远不会返回原始值。
这是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
以下是结果片段:
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
这是来自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
从前五个IsGun = 0中可以看到,CASE
使用固定变量的第一个表达式返回的UsingVar值是我们期望的12.54。对于最后五个,它还返回我们期望的值13。
但在第二CASE
表达式(完全相同的逻辑),则PriceAdj使用CEILING
上他们中的每一个单一的功能,而不管是否IsGun = 1或没有。
为什么查询不返回预期结果?
在一些用于联合的表的视图的数据类型价格1和Price2分别SMALLMONEY和十进制(8,2) 。从那以后,我将它们全部更改为十进制(8,2),但这并不影响结果。