2

注: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

私は何が間違っているのですか?

4

2 に答える 2

3

あなたのケースステートメントは「ケース合計1」ではなく「ケースカテゴリ」であるべきではありませんか?

これを変更すると、クエリは期待どおりに機能します。

于 2012-01-17T14:18:10.633 に答える
2

あなたのケースは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
于 2012-01-17T14:19:02.187 に答える