#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