Ошибка преобразования при добавлении процента к концу значения

#sql #casting #percentage

#sql #Кастинг #процент

Вопрос:

 ,CASE WHEN 
   sq.Total_Sales > 0 THEN 
   CAST(ROUND(CAST(sq.Total_Sales AS FLOAT) / (SUM(pfm.C1)) * 100,0) AS varchar(10))   '%'
   ELSE 0 
   END AS Conversion_Rate
  

Пожалуйста, может кто-нибудь помочь с тем, почему я не могу добавить% в конце?
Я получаю сообщение об ошибке «ошибка преобразования при преобразовании значения varchar ‘25%’ в тип данных int».

Пример данных:

введите описание изображения здесь

Комментарии:

1. @TimBiegeleisen ROUND(... * 100, 0) — 0 является вторым аргументом ROUND .

2. SQL Server 2008

3. @MarcinJ Вы правы… позвольте мне отредактировать, чтобы сделать его более понятным.

4. Какое точное сообщение об ошибке? И каковы базовые типы данных этих столбцов?

5. Я не могу воспроизвести вашу ошибку , используя ваш запрос с фиктивными значениями. Пожалуйста, добавьте примеры данных, чтобы сделать эту проблему воспроизводимой.

Ответ №1:

Итак, столбец, возвращаемый из запроса, может быть только одного типа, верно? При просмотре вашего запроса механизм БД видит два типа в CASE инструкции:

  • CAST(ROUND(CAST(sq.Total_Sales AS FLOAT) / (SUM(pfm.C1)) * 100,0) AS varchar(10)) '%' выдает VARCHAR(11)
  • 0 в ELSE части, является INT

Компонент database engine пытается объединить их оба в INT, и поскольку ‘5%’ не может быть преобразован в INT, вы получаете сообщение об ошибке. Вам нужно изменить свое ELSE 0 значение на что-то, производящее a varchar , like ELSE '0%' или even ELSE '' .

Комментарии:

1. Спасибо!! Такое простое исправление.

Ответ №2:

Похоже, SQL Server не одобряет вашу попытку потенциально использовать целочисленный литерал 0 в конкатенации строк. Произойдет ли это или может произойти на самом деле, это уже другая история. Это не имеет значения, поскольку SQL Server потребует, чтобы вы использовали строки для объединения строк — даже если теоретический путь к объединению невозможен.

Попробуйте это:

 ,CASE WHEN 
   sq.Total_Sales > 0 THEN 
   CAST(ROUND(CAST(sq.Total_Sales AS FLOAT) / (SUM(pfm.C1)) * 100,0) AS varchar(10))   '%'
   ELSE '0' 
   END AS Conversion_Rate