2014-09-15 4 views
0

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

SELECT avg(CAST(NULLIF(Sim1SS,0.0) as DECIMAL)) as MTN , 
avg(CAST(NULLIF(Sim2SS,0.0) as DECIMAL)) as Vodacom 

FROM [Networks].[dbo].[Device] 

я получаю следующее сообщение об ошибке:

Arithmetic overflow error converting varchar to data type numeric.

и здесь является примером столбца SS:

28,99 
10,99 
11,99 
NULL 
NULL 
31,99 
31,99 
NULL 
+0

заменить ',' на '.' –

+0

'SELECT avg (CAST (NULLIF (REPLACE (Sim1SS, ',', '.'), 0.0) как DECIMAL)), поскольку MTN' дает мне такую ​​же ошибку: – Zapnologica

ответ

2

У вас есть две проблемы. Прежде всего, когда вы используете NULLIF для строкового типа данных, вы неявно преобразовываете его в числовой тип данных. Вы указали 0,0 в качестве второго параметра. SQL Server не знает, что выбрать, и он может выбрать float или что-то еще. NULLIF следует вызывать после преобразования строки на номер

Во-вторых, вы не указали точность и масштаб для вашего типа данных DECIMAL. Согласно MSDN по умолчанию точность и масштаб типа данных DECIMAL составляют 18,0. Если вы не указали масштаб, цифры будут усечены.

Таким образом, правильный синтаксис должен быть:

SELECT avg(NULLIF(CAST(Sim1SS as DECIMAL(18,2)), 0.00)) as MTN, 
     avg(NULLIF(CAST(Sim2SS as DECIMAL(18,2)), 0.00)) as Vodacom 
FROM [Networks].[dbo].[Device] 

Кстати, если ваши региональные настройки для десятичного символа не является периодом (.), то вам нужно сделать замену:

SELECT avg(NULLIF(CAST(REPLACE(Sim1SS, ',', '.') as DECIMAL(18,2)), 0.00)) as MTN, 
     avg(NULLIF(CAST(REPLACE(Sim2SS, ',', '.') as DECIMAL(18,2)), 0.00)) as Vodacom 
FROM [Networks].[dbo].[Device] 

Если ваши данные не дезинфицированы, вам необходимо использовать функцию ISNUMERIC, например:

SELECT avg(NULLIF(case when isnumeric(Sim1SS)=1 then CAST(REPLACE(Sim1SS, ',', '.') as DECIMAL(18,2)) end, 0.00)) as MTN, 
     avg(NULLIF(case when isnumeric(Sim2SS)=1 then CAST(REPLACE(Sim2SS, ',', '.') as DECIMAL(18,2)) end, 0.00)) as Vodacom 
FROM [Networks].[dbo].[Device] 
+0

'ошибка преобразования типа данных varchar в числовой .' – Zapnologica

+0

Ok then , тогда у вас есть числовые значения. Вы должны использовать функцию ISNUMERIC для тестирования вместе с CASE – cha

Смежные вопросы