Как привести вычисляемый столбец с правильным десятичным / $ результатом - PullRequest
4 голосов
/ 18 октября 2011

У меня есть следующий вычисляемый столбец в SQL Server 2008

[Total] AS  CAST ( ((val1/(1000)) * [val2]) AS DECIMAL(18,2))  PERSISTED,

Когда val1 = 862500 и val2 = 8, вычисленное значение = 6896.00

Мне нужно, чтобы он был десятичным / денежнымгде (862500/1000) * 8 = 6900,00 (не 6896,00).

Ответы [ 2 ]

5 голосов
/ 18 октября 2011

BOL говорит:

Внимание: при использовании арифметических операторов +, -, *, / или% для неявного или явного преобразования значений констант типа int, smallint, tinyint или bigint.к типам данных с плавающей запятой, вещественным, десятичным или числовым применяются правила, которые SQL Server применяет при вычислении типа данных и точности результатов выражения, в зависимости от того, является ли запрос автоматически параметризованным или нет.

Следовательно, похожие выражения в запросах могут иногда давать разные результаты.Когда запрос не является автопараметризованным, значение константы сначала преобразуется в числовое значение, точность которого достаточно велика, чтобы содержать значение константы, перед преобразованием в указанный тип данных.Например, постоянное значение 1 преобразуется в числовое значение (1, 0), а постоянное значение 250 преобразуется в числовое значение (3, 0).

Когда запрос автопараметризован, постоянное значение всегда преобразуется в числовое (10, 0) перед преобразованием в окончательный тип данных.Когда задействован оператор /, точность результата типа может отличаться не только среди похожих запросов, но и значение результата может отличаться.Например, значение результата запроса с автопараметризацией, содержащего выражение SELECT CAST (1.0 / 7 AS float), будет отличаться от значения результата того же запроса, который не автопараметризован, поскольку результаты запроса с автопараметризацией будут усечены до соответствияв числовой (10, 0) тип данных.Для получения дополнительной информации о параметризованных запросах см. Простая параметризация.

Итак, вам необходимо преобразовать [val1], 1000 и [val2] в типы с плавающей запятой:

[Total] AS CAST ( ((CAST ([val1] as float)/CAST (1000 as float)) * CAST ([val2] as float)) AS DECIMAL(18,2)) PERSISTED
4 голосов
/ 18 октября 2011

Я придумал это:

SELECT  (cast(862500 as float)/cast(1000 as float) ) * 8  

returns 6900

Чтобы сделать это 2 десятичных знака ....

SELECT  cast((cast(862500 as float)/cast(1000 as float) ) * 8  as decimal(18,2))

returns 6900.00

Ваш конкретный случай:

[Total] AS  CAST ( ((cast(val1 as float)/(1000)) * cast([val2] as float)) AS DECIMAL(18,2))  PERSISTED,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...