#sql #sql-server #casting #decimal #nvarchar
#sql #sql-server #Кастинг #десятичный #nvarchar
Вопрос:
Я использую SQL Server 2016, и в моем запросе есть следующий код T-SQL:
CAST(ROUND([Count of Bookings] * 100.0 / SUM([Count of Bookings]) OVER (PARTITION BY [Market Final], [PropertyCode]), 0) AS NVARCHAR(15)) '%'
Примером текущего вывода этого кода является: 40.000000000000%
Я ожидал, что результат будет: 40%
В качестве примечания (я не знаю, уместно ли это): если я изменяю число в nvarchar(x)
на меньшее, чем 15, я получаю следующую ошибку:
Ошибка арифметического переполнения, преобразующая выражение в тип данных nvarchar.
Комментарии:
1. Вам не нужны десятичные знаки?
2. Либо увеличьте размер вашего varchar, либо сначала преобразуйте его в int, чтобы удалить конечные 0.
Ответ №1:
Используйте str()
вместо cast()
:
str(round([Count of Bookings] * 100.0 /
sum([Count of Bookings]) over(PARTITION BY [Market Final], [PropertyCode]
) , 0), 3, 0) '%'
На самом деле, я думаю str()
, что по умолчанию выполняется округление (может ли документация быть менее ясной по этому вопросу?):
str([Count of Bookings] * 100.0 /
sum([Count of Bookings]) over (PARTITION BY [Market Final], [PropertyCode]
), 3, 0) '%'
Комментарии:
1. Работает великолепно!
![]()
Ответ №2:
Тип возвращаемого значения любого ввода ROUND()
функции зависит от типа входных данных, как вы можете видеть в MSDN.
Это приводит ROUND()
к тому, что вы возвращаете тип данных с десятичной точкой (в этом вычислении a float
), который вам придется усечь после преобразования nvarchar
(или привести его к int
before ).