В моей базе данных я дал столбцы CHARGECODE
и CHARGECODE_URGENT
с типом данных varchar
и длиной 15.
Однако, чтобы вздремнуть, мне нужно, чтобы два данных стали десятичными.
Большинство значений, например, (40 или 55). Но есть еще 44.00 и -450.
Поэтому я попытался преобразовать их с помощью CAST и CONVERT.
string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CAST(CHARGECODE_URGENT AS decimal) ELSE CAST(CHARGECODE AS decimal) END) AS Somme FROM JOB_HEADER";
Я также пробовал:
string cmdText = @"SELECT SUM(CASE WHEN TEST_URGENT = 'T' THEN CONVERT(decimal, CHARGECODE_URGENT) ELSE CONVERT(decimal,CHARGECODE) END) AS Somme FROM JOB_HEADER";
Я все еще получаю эту ошибку:
An unhandled exception of type 'System.Data.SqlClient.SqlException' occurred in System.Data.dll
Additional information: Error converting data type varchar to numeric.
Тем не менее я проверяю, возможно ли преобразование, и это кажется так. Поэтому я думаю, что у меня проблема с синтаксисом. Спасибо за вашу помощь
Обоснование ответа Гордона ниже заключается в том, что по крайней мере одно из ваших значений, когда tets_urgent=T не подходит для преобразования в десятичное число. В нем либо есть текст, либо он «пустой».
@stickybit Я стажер, это не «моя база данных». Я использую созданную базу данных, которую не могу редактировать.
насколько чистые данные?
Вы должны быть уверены, что все значения, хранящиеся в таблице, действительны и могут быть преобразованы, иначе вы получите исключения. Может быть, вы можете показать нам некоторые данные.
@eripap Я проверил строку 1000 в базе данных, и вы правы, ошибка исходила от меня. Даже если большинство значений например (40 или 55) я не видел и 44.00 и -450. Я не могу преобразовать их в десятичную? Извините, если это очевидно, я новичок
Используйте TRY_CAST()
или TRY_CONVERT()
:
SELECT SUM(CASE WHEN TEST_URGENT = 'T'
THEN TRY_CAST(CHARGECODE_URGENT AS decimal)
ELSE TRY_CAST(CHARGECODE AS decimal)
END) AS Somme
FROM JOB_HEADER;
Чтобы найти плохие значения, вы можете сделать:
select CHARGECODE_URGENT
from job_header
where try_cast(CHARGECODE_URGENT as decimal) is null and
test_urgent = 'T';
а также:
select CHARGECODE
from job_header
where try_cast(CHARGECODE as decimal) is null and
test_urgent <> 'T';
Я получаю новую ошибку: «TRY_CAST» не является распознанным именем встроенной функции.
Как я могу суммировать эти два запроса?
Почему вы использовали
varchar
, если вы хотитеdecimal
в первую очередь?