Я продолжаю получать ошибку:
Ошибка преобразования при преобразовании значения varchar «789.08» в тип данных int.
Столбец Sales
из Table3
определяется как varchar(20) null
.
Обратите внимание, что столбец «Продажи» включает значения varchar, такие как «Не найдено» или пустое пространство «», а также десятичные значения, такие как «789,08». Я никогда не видел этого раньше. Мне определенно нужна чья-то поддержка.
SELECT DISTINCT
a.AccountNumber,
a.LocationNum,
b.DateSubmitted,
CAST (replace(d.Sales, ',', '') AS int) AS 'Sales',
d.Description
FROM
Table1 a
INNER JOIN
Table2 b ON a.AccountNumber = b.AccountNumber
INNER JOIN
Table3 d ON d.AccountNumber = b.AccountNumber
Вы пытаетесь преобразовать 789,08 в целое число, что, очевидно, не сработает, вам нужно будет преобразовать его в десятичное число.
как удалить десятичную дробь и преобразовать в целое число?
Какую платформу базы данных вы используете? Сообщение об ошибке похоже на SQL Server? Кроме того, каковы ваши желаемые результаты для строк со значениями, которые не являются допустимыми целыми числами? например «Не найдено» или пустое место «», а также десятичные значения, например «789,08».
я использую SQL. результат таких действий, как «Не найдено» или «пустое пространство», я хочу, чтобы возвращаемое значение было равно нулю (0) в числовом виде, а десятичное значение удалено и возвращаемое значение было 789.
Вероятно, вам придется использовать оператор CASE, а затем обрабатывать каждый тип данных в столбце в своем собственном операторе.
«Я использую SQL» — однако это бывает во многих вариантах, каждый из которых имеет разные возможности. Так какую СУБД вы на самом деле используете? SqlServer, Oracle, MySql, Sqlite,...? Пожалуйста, добавьте правильный тег
Вы используете «SQL Server» от Microsoft?
Как использовать десятичный оператор в случае, когда операторы?
да, я использую SSMS v20.
«Как мне использовать десятичный оператор в случае, если операторы?» Итак, изучив утверждения CASE, что вы на самом деле пробовали?
попробуйте забросить/конвертировать в деньги... это немного проще. Например, try_convert(money,'1,708.52'). Затем при необходимости вы можете преобразовать в int.
Вам следует предоставить дополнительную информацию о столбце продаж. Если столбец продаж ожидает десятичное значение, вам нужно преобразовать d.Sales
из varchar в десятичное, а не в int. Кроме того, если в столбце продаж указано целое число, вы не сможете преобразовать 789,08 в целое число:
select Distinct
a.AccountNumber,
a.LocationNum,
b.DateSubmitted,
TRY_CAST(replace(d.Sales, ',', '') AS decimal(10, 2)) as 'Sales',
d.Description
from Table1 a
inner join Table2 b on a.AccountNumber = b.AccountNumber
inner join Table3 d on d.AccountNumber = b.AccountNumber
Если TRY_CAST
завершится неудачей, он вернет значение null, следовательно, запрос не завершится неудачей при попытке привести недопустимое значение.
Объяснение сделало бы этот ответ лучшим.
Я попробовал предложенное десятичное число, как показано, но получил эту ошибку: (Ошибка преобразования типа данных varchar в числовой.) Обратите внимание, что данные включают сохраненные значения, такие как (Не найдено).
@Kkoruni, тебе нужен try_cast, проверь ответ еще раз
Привет Дейл и Висенте! Благодарим вас за рекомендации по функции try_cast. Я внес изменения в свой запрос и создал временную таблицу для получения результатов в формате varchar, а затем использовал функцию try_cast. Теперь у меня есть результаты в нужном мне формате. Спасибо вам и всем в этом посте за помощь в этом вопросе.
@Kkoruni, ты можешь пометить это (или ответ, который помог тебе решить проблему) как ответ на вопрос
Целые числа — это целые числа, такие как 1, -1, 42 и 789. Они хранятся в различных целочисленных типах .
789,08 — десятичное число. Обычно существует два способа их хранения: числа с плавающей запятой или числа произвольной точности . Они хранятся в формате с плавающей запятой и в десятичном формате или numeric
. У них обоих есть предостережения.
Числа с плавающей запятой могут быть неточными. Если важно, чтобы 789.08 был точно представлен, например, если это валюта, используйте decimal(10,2)
.
Поскольку столбец «Продажи» содержит много мусора, вам придется проделать дополнительную работу для обработки нечисловых значений. Если вы используете try_cast вместо cast
, неконвертируемые значения вернутся как null
.
TRY_CAST(
replace(d.Sales, ',', '') AS decimal(10,2)
) AS 'Sales'
Хоть убей, я не понимаю, зачем хранить что-либо в целочисленном столбце, например, varchar, пустые места или десятичные дроби. У вас есть пример, которым вы можете поделиться, как использовать числа с плавающей запятой, десятичные или числовые значения в этом SQL, который я предоставил?
@Kkoruni Я добавил пример использования с try_cast
. В разделе «Продажи» хранился мусор, поскольку это допускал тип данных varchar(20)
. Чтобы избежать этого, используйте наиболее строгий и подходящий тип данных и ограничения , чтобы точно знать, что хранится в столбце. Эта проблема известна как «целостность данных». Небрежные данные все усложняют.
спасибо за руководство по функции try_cast. Я внес изменения в свой запрос и создал временную таблицу для получения результатов в формате varchar, а затем использовал функцию try_cast. Теперь у меня есть результаты в нужном мне формате.
@Kkoruni Рад, что это помогло. Вам не нужна временная таблица, вы сможете сделать это с помощью одного запроса.
Прежде всего, невозможно напрямую преобразовать десятичные значения в int, и любезно предоставьте дополнительную информацию о Декларации переменных.
Надеюсь, эта ссылка будет полезна Geeks4geeks SQL конвертирует Varchar в Int
тег с платформой базы данных