У вас есть две проблемы. Прежде всего, когда вы используете 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]
заменить ',' на '.' –
'SELECT avg (CAST (NULLIF (REPLACE (Sim1SS, ',', '.'), 0.0) как DECIMAL)), поскольку MTN' дает мне такую же ошибку: – Zapnologica