Мне нужно усреднить некоторые значения в строке -wise fashion, а не столбец -wise fashion. (Если бы я делал средний по столбцам, я мог бы просто использовать avg()
). Мое конкретное применение этого требует, чтобы я игнорировал NULL при усреднении. Это довольно простая логика, но в SQL это кажется ужасно трудным. Есть ли элегантный способ делать мои расчеты?Вычисление нескольких столбцов в SQLite3
Я использую 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
Coalesce каждое значение 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
Но это кажется намного больше программ, чем это должен взять. Есть ли элегантный способ сделать это, о котором я не знаю?
Update:
Если я что-то недоразумение, avg()
не будет работать для этого.Пример того, что я хотел бы сделать:
select avg(q7, q33, q38, ..., q119) from survey;
Выход:
SQL error near line 3: wrong number of arguments to function avg()
Я думаю, что БД в вашей форме не нормируется, поэтому нет простого способа манипулировать данными с помощью «набора». – munissor
Я обновил свой ответ, чтобы отразить проблемы вашего обновления с помощью 'AVG'. – Welbog
Что касается проблем нормализации, то как данные существуют в текущей базе данных. (Я не проектировал это - серьезно, 144 + столбцы?), Но я должен выбирать свои битвы.) Я мог бы просто укусить пулю и написать что-то, чтобы нормализовать это, чтобы обработать. –