我需要在行 - 而不是一個列 - 時尚平均一些值。 (如果我在列平均水平上,我可以使用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