Мне нужно усреднить некоторые значения в порядке строки , а не в столбце . (Если бы я делал среднее по столбцам, я мог бы просто использовать avg()
). Мое конкретное применение этого требует, чтобы я игнорировал значения NULL при усреднении. Это довольно простая логика, но кажется, что в SQL это сделать крайне сложно. Есть ли элегантный способ сделать мой расчет?
Я использую SQLite3, для чего он стоит.
Подробнее
Если вам нужны подробности, вот иллюстрация:
У меня есть таблица с опросом:
| q1 | q2 | q3 | ... | q144 |
|----|-------|-------|-----|------|
| 1 | 3 | 7 | ... | 2 |
| 4 | 2 | NULL | ... | 1 |
| 5 | NULL | 2 | ... | 3 |
(Это только некоторые примерные значения и простые имена столбцов. Допустимые значения: от 1 до 7 и NULL.)
Мне нужно вычислить некоторые средние значения, например, так:
q7 + q33 + q38 + q40 + ... + q119 / 11 as domain_score_1
q10 + q11 + q34 + q35 + ... + q140 / 13 as domain_score_2
...
q2 + q5 + q13 + q25 + ... + q122 / 12 as domain_score_14
... но мне нужно извлечь нулевые и средние значения, основанные на ненулевых значениях. Итак, для domain_score_1
(в котором есть 11 элементов) мне нужно сделать:
Input: 3, 5, NULL, 7, 2, NULL, 3, 1, 5, NULL, 1
(3 + 5 + 7 + 2 + 3 + 1 + 5 + 1) / (11 - 3)
27 / 8
3.375
Простой алгоритм, который я рассматриваю:
Введите:
3, 5, NULL, 7, 2, NULL, 3, 1, 5, NULL, 1
Объединяет каждое значение в 0, если NULL:
3, 5, 0, 7, 2, 0, 3, 1, 5, 0, 1
Сумма:
27
Получите число ненулевых значений путем преобразования значений> 0 в 1 и суммы:
3, 5, 0, 7, 2, 0, 3, 1, 5, 0, 1
1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1
8
Разделите эти два числа
27 / 8
3.375
Но это, кажется, намного больше программирования, чем это должно занять. Есть ли элегантный способ сделать это, о котором я не знаю?
Обновление:
Если я что-то не так понимаю, avg()
не подойдет для этого. Пример того, что я хотел бы сделать:
select avg(q7, q33, q38, ..., q119) from survey;
Выход:
SQL error near line 3: wrong number of arguments to function avg()