我有一个在 Oracle 表中有 32 列的表。
- 其中两个列是标识列
- 其余的是价值观
我想获得所有值列的平均值,这因空(身份)列而变得复杂。下面是我想要实现的伪代码:
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))
这里的困难当然是为任何非空列获取 1。看来我需要一个类似于 NVL 的函数,但有一个 else 子句。如果值为 null,则返回 0,否则返回 1,而不是值本身。
我应该如何获得分母的价值?
PS:我觉得我必须解释一下这个设计背后的一些动机。理想情况下,该表将被组织为标识列和每行一个值,并带有行本身的一些标识符。这会使它更加规范化,并且该问题的解决方案将非常简单。不这样做的原因是吞吐量和节省空间。这是一个巨大的数据库,我们每分钟向其中插入 1000 万个值。将这些值中的每一个设为一行将意味着每分钟 1000 万行,这绝对是无法实现的。将其中的 30 个打包成一行可以减少插入到我们可以使用单个 DB 执行的操作的行数,并且开销数据量(身份数据)要少得多。