Saya mengalami masalah di mana CASE
ekspresi tidak mengembalikan apa yang saya harapkan.
Sebagai tes, saya menambahkan variabel desimal dan menjalankan CASE
ekspresi yang sama terhadapnya dan berfungsi dengan baik, mengembalikan hasilnya seperti yang saya harapkan (pembulatan nilainya ketika IsGun=1
. Tapi ketika saya menjalankan CASE
ekspresi yang sama terhadap nilai desimal lainnya, selalu mengembalikan nilai dengan CEILING()
fungsi dan tidak pernah mengembalikan nilai aslinya.
Berikut adalah kode 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
Berikut cuplikan hasilnya:
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
Dan ini data yang berasal dari 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
Seperti yang Anda lihat dari lima pertama, di mana IsGun = 0, CASE
ekspresi pertama menggunakan variabel tetap mengembalikan nilai UsingVar seperti yang kita harapkan, 12,54. Dan untuk lima terakhir, itu juga mengembalikan nilai yang kita harapkan, 13.
Tetapi dalam CASE
ekspresi kedua (logika yang persis sama), PriceAdj menggunakan CEILING
fungsi pada setiap satu dari mereka, terlepas dari apakah IsGun = 1 atau tidak.
Mengapa kueri tidak mengembalikan hasil yang diharapkan?
Dalam beberapa tabel yang digunakan untuk serikat melihat jenis data untuk Price1 dan Price2 yang smallmoney dan desimal (8,2) . Sejak itu saya mengubah semuanya menjadi desimal (8,2) , tetapi itu tidak mempengaruhi hasilnya.
sumber
iif
akan diperluas kecase
. Ini mengembalikan tipe dengan prioritas tipe data terbesar dari dua opsi. Ekspresi tipe X dalam satu baris dan baris data Y tidak mungkin dilakukan untuk baris yang lain untuk kolom yang sama.