ฉันพบปัญหาที่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)แต่นั่นไม่ได้ส่งผลกระทบต่อผลลัพธ์