Oracle テーブルに 32 列のテーブルがあります。
- これらの列のうち 2 つは ID 列です
- 残りは値です
すべての値列の平均を取得したいと思いますが、これは null (ID) 列によって複雑になります。以下は、私が達成しようとしているものの擬似コードです。
SELECT
((nvl(val0, 0) + nvl(val1, 0) + ... nvl(valn, 0))
/ nonZero_Column_Count_In_This_Row)
nonZero_Column_Count_In_This_Row = (ifNullThenZeroElse1(val0) + ifNullThenZeroElse1(val1) ... ifNullThenZeroElse(valn))
ここでの難しさはもちろん、null 以外の列に対して 1 を取得することです。NVL に似た関数が必要なようですが、else 句が必要です。値自体ではなく、値が null の場合は 0 を返し、そうでない場合は 1 を返すもの。
分母の値を取得するにはどうすればよいですか?
PS: このデザインの背後にある動機を説明しなければならないと感じています。理想的には、このテーブルは ID 列として編成され、行ごとに 1 つの値が行自体の識別子と共に構成されていました。これにより、より正規化され、この問題の解決策は非常に簡単になります。このようにしない理由は、スループットとスペースの節約です。これは、毎分 1000 万の値を挿入する巨大な DB です。これらの値をそれぞれ 1 行にすると、1 分あたり 1,000 万行になり、これは絶対に達成できません。それらの 30 個を 1 つの行にパックすると、挿入される行の数が 1 つの DB でできることを減らし、オーバーヘッド データ量 (ID データ) がはるかに少なくなります。