Tôi đã gặp phải một vấn đề trong đó một CASE
biểu thức không trả về những gì tôi mong đợi.
Khi thử nghiệm, tôi đã thêm một biến thập phân và chạy cùng CASE
biểu thức với nó và nó hoạt động tốt, trả về kết quả như tôi mong đợi (làm tròn giá trị lên khi IsGun=1
. Nhưng khi tôi chạy CASE
biểu thức tương tự với giá trị thập phân khác, nó luôn trả về giá trị với CEILING()
hàm và không bao giờ trả về giá trị ban đầu.
Đây là mã 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
Đây là một đoạn kết quả:
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
Và đây là dữ liệu được lấy từ v Products_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
Như bạn có thể thấy từ năm đầu tiên, trong đó IsGun = 0, CASE
biểu thức đầu tiên sử dụng biến cố định trả về giá trị UseVar như những gì chúng ta mong đợi, 12,54. Và trong năm vừa qua, nó cũng trả về giá trị mà chúng ta mong đợi, 13.
Nhưng trong CASE
biểu thức thứ hai (chính xác là cùng một logic), PriceAdj sử dụng CEILING
hàm trên mỗi một trong số chúng, bất kể IsGun = 1 hay không.
Tại sao truy vấn không trả về kết quả mong đợi?
Trong một số bảng được sử dụng cho chế độ xem kết hợp, các kiểu dữ liệu cho Price1 và Price2 là smallmoney và binary (8.2 ) . Tôi đã thay đổi tất cả thành số thập phân (8.2) , nhưng điều đó không ảnh hưởng đến kết quả.