列ごとの方法ではなく、行ごとの方法でいくつかの値を平均化する必要があります。(列ごとの平均を行っている場合は、 を使用できます)。これの私の特定のアプリケーションでは、平均化で NULL を無視する必要があります。これは非常に単純なロジックですが、SQL で行うのは非常に難しいようです。私の計算を行うエレガントな方法はありますか?avg()
価値があるので、私は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
その 2 つの数を割ります
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()