我需要在行 - 而不是一个列 - 时尚平均一些值。 (如果我在列平均水平上,我可以使用avg()
)。我的具体应用要求我在平均时忽略NULL。这是非常简单的逻辑,但在SQL中看起来非常困难。有没有一个优雅的方式来做我的计算?在SQLite3中计算多列平均值
我正在使用SQLite3,它的价值。
详细
如果您需要更多的细节,这里就是一个例证:
我有一个调查AA表:
| 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()
我认为DB在你的形式不被标准化,所以没有简单的方法来处理数据的“设置为本”的方式。 – munissor 2010-03-30 15:40:52
我已更新我的回答,以反映您对'AVG'的更新问题。 – Welbog 2010-03-30 15:49:19
关于规范化问题,这是数据在当前数据库中的存在方式。 (我没有设计它 - 严格来说,有144列以上 - 但我必须选择我的战斗。)我可能会咬紧牙关,写一些东西来规范化处理。 – 2010-03-30 16:21:28