У меня есть таблица с 32 столбцами в таблице Oracle.
- Два из этих столбцов являются столбцами идентификаторов.
- остальное - ценности
Я хотел бы получить среднее значение всех столбцов значений, что усложняется нулевыми (идентификационными) столбцами. Ниже приведен псевдокод того, чего я пытаюсь достичь:
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. Что-то, что вернет 0, если значение равно null, и 1, если нет, а не само значение.
Как мне получить значение знаменателя?
PS: я чувствую, что должен объяснить некоторые мотивы этого дизайна. В идеале эта таблица должна быть организована как столбцы идентификаторов и одно значение в строке с некоторым идентификатором самой строки. Это сделало бы его более нормализованным, и решение этой проблемы было бы довольно простым. Причины, по которым этого нельзя делать, - пропускная способность и экономия места. Это огромная БД, куда мы вставляем 10 миллионов значений в минуту. Если сделать каждое из этих значений одной строкой, это будет означать 10 миллионов строк в минуту, что определенно недостижимо. Упаковка 30 из них в одну строку уменьшает количество вставляемых строк до того, что мы можем сделать с одной БД, а количество служебных данных (идентификационных данных) намного меньше.