2

私は次のようなSQLを持っています:

select avg(decode(type, 'A', value, null) + decode(type, 'B', value, null)) from table;

これに関する問題は、これらの型の一部が null になる可能性があることです。したがって、null に何かを追加すると null になるため、加算部分は null になります。したがって、デコードをnullから0に変更できると思うかもしれませんが、それは avg() がそれを平均化の一部としてカウントするように見えますが、そうすべきではありません/平均の一部としてカウントしたくありません.

理想的には、追加ではヌルを無視し、残りの値に追加しようとしないだけです。

それでは、私の数字は次のとおりです。

5 + 6 + 5
3 + 2 + 1
4 + null + 2

合計は 28 で、8 で割りたい (null を無視) ですが、デコードで null を 0 に変更すると、平均は 9 で割りますが、これは私が望むものではありません。

4

4 に答える 4

1

書かれnullているように、最初のコードが を返す場合decodevalue2 番目のコードは常に を返す必要があるため、コードは常に を返すdecode必要がありますnull。コードを一般化する際にエラーが発生し、実際に意図したのは次のとおりであると想定します。

avg(decode(type1, 'A', value1, null) + decode(type2, 'B', value2, null))

(または、 の代わりにtype1である可能性がありますa.type。ポイントは、2 つのデコードのフィールドが別々のフィールドであることを意味することです)


この場合、最初に null をチェックするのが最も簡単だと思います。

avg(case when type1 is null and type2 is null then null
    else case type1 when 'A' then value1 else 0 end
       + case type2 when 'B' then value2 else 0 end
    end)

(読みやすいのでに置き換えdecodeましたが、この場合も同様に機能します。)casedecode

于 2013-04-23T13:22:48.063 に答える
0

ここでのロジックは少し複雑です。

select avg((case when type = 'A' then value else 0 end) + (case when type = 'B' then value else 0 end))
from table
where type in ('A', 'B')

このwhere句は、少なくとも 1 つの「A」または「B」があることを保証します。「A」または「B」の例がない場合に問題が発生します。

于 2013-04-23T13:23:52.193 に答える
0

簡単な回避策は、自分で平均を計算することです。

select 
    -- The sum of all values with type 'A' or 'B'
    sum(decode(type, 'A', value, 'B', value, 0)) /
    -- ... divided by the "count" of all values with type 'A' or 'B'
    sum(decode(type, 'A', 1, 'B', 1, 0))
from table;

SQLFiddle の

しかし、機能する方法AVG()は、追加を削除してすべてを1つにまとめれば、おそらく十分でしょう。DECODE()

select avg(decode(type, 'A', value, 'B', value, null)) from table
于 2013-04-23T13:14:39.377 に答える
0

ここで合計を計算するには複雑すぎます。CASE で値を出力するだけで完了です。

SELECT AVG(
    CASE WHEN type = 'A' OR type = 'B' 
    THEN value
    ELSE null
    END
) 
FROM table
于 2013-04-23T13:15:21.820 に答える