SQL - десятичные дроби в столбцах varchar - PullRequest
0 голосов
/ 02 июля 2019

Почему этот запрос тянет 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).

Я бы не ожидал значения 99.73 в наборе результатов из-за предложения where.

Ответы [ 5 ]

2 голосов
/ 02 июля 2019

Количество десятичных знаков по умолчанию: 0.Если вы укажете десятичную с точностью и масштабом, вы получите правильный результат, который вам нужен:

SELECT CAST('99.73' AS DECIMAL(18,2))

1 голос
/ 02 июля 2019

Если вы приведете 99,73 к DECIMAL, вы получите 100, так что ожидается результат, учитывая, что десятичная часть делает что-то вроде этого для точности 2 десятичных знаков

 CAST(measure_rate AS DECIMAL(38, 2))

(38 для точности - это просто пример, выберите число, которое лучше соответствует вашим данным)

0 голосов
/ 02 июля 2019

Точность следует указывать при приведении к 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

Результат показан на рисунке ниже. enter image description here

0 голосов
/ 02 июля 2019

Вам необходимо определить точность десятичного числа цифр и числа десятичных знаков Вы можете использовать

;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
0 голосов
/ 02 июля 2019

У вас нет масштаба или точности для decimal, поэтому используется значение по умолчанию. Это, вероятно, означает, что шкала установлена ​​на 0, поэтому '99.73' приводится к 100 из-за округления.

Если вы измените тип данных столбца в таблице с varchar на decimal с соответствующим масштабом и точностью, этого не произойдет. Это только одна из причин, почему неправильный тип данных является плохим решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...