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로 반환합니다 . 그리고 마지막 5 개의 경우 예상 값인 13도 반환합니다.
그러나 두 번째 CASE
표현식 (정확히 동일한 논리)에서 PriceAdj 는 IsGun = 1 CEILING
인지 여부에 관계없이 모든 단일 함수에서 함수를 사용합니다 .
쿼리가 예상 결과를 반환하지 않는 이유는 무엇입니까?
통합 뷰에 사용 된 일부 테이블에서 Price1 및 Price2 의 데이터 유형 은 smallmoney 및 decimal (8,2) 입니다. 이후에 그것들을 모두 decimal (8,2) 로 변경했지만 결과에는 영향을 미치지 않았습니다.