为什么我指定了99.73
时此查询会拉cast(measure_rate as decimal)= 100
?
;WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY zip_code ORDER BY cast(measure_rate as decimal) DESC) AS rn
FROM AmbulatoryMeasures
where measure_rate != 'n/a'
)
SELECT *
FROM cte
WHERE rn = 1
and cast(measure_rate as decimal) = 100
measure_rate
列的结果-
100
99.73
100
100
measure_rate
列的数据类型是varchar(50)。
由于where子句,我不希望结果集中有99.73
值。
答案 0 :(得分:2)
默认的小数位数为0
。如果您以精度和小数位数指定小数,则将得到正确的结果:
SELECT CAST('99.73' AS DECIMAL(18,2))
答案 1 :(得分:1)
如果将99.73强制转换为DECIMAL,则得到100,这样就可以得到预期结果,请考虑使用小数部分的精度,例如2位小数
CAST(measure_rate AS DECIMAL(38, 2))
(38精度只是一个例子,请选择一个更适合您的数据的数字)
答案 2 :(得分:0)
decimal
没有刻度或精度,因此使用默认值。这可能意味着缩放比例设置为0,因此由于舍入,'99.73'
被强制转换为100
。
如果以适当的比例和精度将表中列的数据类型从varchar
更改为decimal
,则不会发生这种情况。这只是选择错误数据类型是一个错误决定的原因之一。
答案 3 :(得分:0)
您需要定义小数位数和小数位数的精度 您可以使用
;WITH cte AS
(
SELECT *,
ROW_NUMBER() OVER (PARTITION BY zip_code ORDER BY cast(measure_rate as decimal) DESC) AS rn
FROM AmbulatoryMeasures
where measure_rate != 'n/a'
)
SELECT *
FROM cte
WHERE rn = 1
and cast(measure_rate as decimal(16,2)) = 100
答案 4 :(得分:0)
在转换为DECIMAL时,应指定精度。 考虑以下两个片段。
--Your situation - no precision
DECLARE @test AS TABLE(MYVALUE VARCHAR(50));
INSERT INTO @test
SELECT '99.73';
SELECT myvalue,
CAST(myvalue AS DECIMAL)
FROM @test
WHERE CAST(myvalue AS DECIMAL) = 100;
--Casting with precision
DECLARE @test2 AS TABLE(MYVALUE VARCHAR(50));
INSERT INTO @test2
SELECT '99.73';
SELECT myvalue,
CAST(myvalue AS DECIMAL(10,2))
FROM @test2