Примечание: я читал похожие темы в SO, но не помог в этом запросе.
Я воспроизвел следующий код, который похож на мою реальную проблему.Я должен использовать этот синтаксис, потому что он уже использовался в базе данных, если только нет убедительных советов, логика здесь неверна.
В моей реальной проблеме этот запрос работает большинство времени, но не удается в определенное время.После исследования я обнаружил, что проблема
ISNULL(amount,0)
Это потому, что если какая-либо категория имеет оба значения 0,0 или оба значения null, null, ISNULL
делает их строкой, и поэтому я получаю
Ошибка преобразования типа данных varchar в число с плавающей точкой
Ниже приведен мой тестовый код с комментариями
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
Что я делаю не так?