当我指定了cast(measure_rate as decimal)= 100时,为什么这个查询拉取99.73
;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) = 100measure_rate列的结果是-
100
99.73
100
100measure_rate列的数据类型是varchar(50)。
因为where子句,我不希望结果集中有99.73值。
发布于 2019-07-02 20:56:41
在转换为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结果如下图所示。

发布于 2019-07-02 20:50:38
默认的小数位数为0。如果您指定具有精度和小数位数的小数位数,您将获得正确的结果:
SELECT CAST('99.73' AS DECIMAL(18,2))
发布于 2019-07-02 20:50:16
如果您将99.73转换为DECIMAL,则得到100,因此结果是预期的,为了考虑小数部分,对于2个小数的精度如下所示
CAST(measure_rate AS DECIMAL(38, 2))(38精度只是一个例子,选择一个更适合您的数据的数字)
https://stackoverflow.com/questions/56852793
复制相似问题