Ошибка преобразования типа данных varchar в float — связана с ISNULL

Примечание. Я читал похожие темы на SO, но не помог в этом запросе.

Я воспроизвел следующий код, который похож на мою настоящую проблему. Я должен использовать этот синтаксис, потому что он уже используется в базе данных, если нет убедительного совета, логика здесь неверна.

В моей реальной проблеме этот запрос работает большую часть времени, но в определенное время дает сбой. После изучения я обнаружил, что проблема

ISNULL(amount,0)

Это связано с тем, что если какая-либо категория имеет оба значения 0,0 или оба значения null, null, ISNULL делает их строкой, и поэтому я получаю

Ошибка преобразования типа данных varchar в float

Ниже приведен мой тестовый код с комментариями.

create table #table1 (
id int not null primary key identity,
category varchar(10),
amount float null
)

insert into #table1 values('A',23)
insert into #table1 values('A',23)
insert into #table1 values('B',NULL)
insert into #table1 values('B',0)
insert into #table1 values('C',NULL)
insert into #table1 values('C',NULL)
insert into #table1 values('D',0)
insert into #table1 values('D',0)

select * from #table1 -- works

select category, sum1  -- works
 from 
(select category, SUM(Round(ISNULL(amount,0),0)) as Sum1 from #table1
group by category)  D

select category, sum2 = -- does not work
case Sum1
    when 'A' then Sum1 * 1   -- my problem is here
    when 'B' then Sum1 * 2   -- this is the logic in my actual code
    when 'C' then Sum1 * 3   -- would like to make this query work
    when 'D' then Sum1 * 4
    else Sum1
end 
 from 
(select category, SUM(Round(ISNULL(amount,0),0) ) as Sum1 from #table1
group by category)  D

Что я делаю не так?


person Hammad Khan    schedule 17.01.2012    source источник


Ответы (2)


Разве ваше заявление о случае не должно быть «категорией случая», а не «сумма случая1»?

Если вы измените это, запрос будет работать так, как ожидалось.

person Derek Kromm    schedule 17.01.2012
comment
Это была точная ошибка, которую я сделал в реальном коде. Спасибо. это ответ - person Hammad Khan; 17.01.2012

в вашем случае нужно смотреть на категорию, а не на sum1

select category, sum2 = -- does not work
case category
    when 'A' then Sum1 * 1   -- my problem is here
    when 'B' then Sum1 * 2   -- this is the logic in my actual code
    when 'C' then Sum1 * 3   -- would like to make this query work
    when 'D' then Sum1 * 4
    else Sum1
end 
 from 
(select category, SUM(Round(ISNULL(amount,0),0) ) as Sum1 from #table1
group by category)  D
person SQLMenace    schedule 17.01.2012