我需要以逐行方式而不是逐列方式平均一些值。(如果我要按列进行平均,我可以使用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
如果为 NULL,则将每个值合并为 0:
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()