2016-10-11 1 views
2

Я использую SQL Server 2016 и у меня есть следующий код T-SQL в моем запросе:Как исправить этот синтаксис 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, я получаю следующее сообщение об ошибке:

Arithmetic overflow error converting expression to data type nvarchar.

+0

Вы не хотите какой-либо десятичную мест? –

+0

Либо увеличьте размер вашего varchar, либо сначала преобразуйте его в int, чтобы опустить конечные 0. –

ответ

2

Использование 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) + '%' 
+0

Прекрасно работает! :-) – user3115933

0

Тип возврата любого входа функции ROUND() зависит от типа входных данных, как вы можете видеть на MSDN.

Это заставляет ваш ROUND() возвращать тип данных с десятичной точкой (в этом расчете float), что вам придется укоротить после преобразования в nvarchar (или бросить его в int раньше).

Смежные вопросы