Как исправить этот синтаксис T-SQL, чтобы получить результат без десятичных знаков?

#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 ).