2016-10-14 5 views
0

テーブルにヌルフィールドがある場合、SQLの平均を計算するのに苦労しています。私は平均を計算する前にヌルを持つフィールドを10に置き換えたい。私は次のような関係を持っていると仮定します。SQLiteのヌル値との関係から平均を計算する

x | y 
------- 
j | 3 
k | 4 
l | NULL 
n | 55 

マイロジック、これまでにnull値があるyのすべてのフィールドを取得し、そのテーブル内の項目の合計、カウントを取り、その後、合計してカウントを取るためになっていますヌル値を持たないフィールドの数。これから、合計とカウントの両方を結合し、平均を計算します。これまでのところ、私は次のクエリを持っています:

SELECT sum1+sum2/c1+c2 
FROM (SELECT sum(cap) as sum1, count(*) as c1 FROM courses) 
UNION (SELECT SUM(null_fields) as sum2, c2 
FROM (SELECT 10 as null_fields, count(*) as c2 FROM courses 
WHERE cap IS NULL)) 

しかし、これは動作しません。何かご意見は?

答えて

1

使用coalesce()

select avg(coalesce(cap, 10)) 
from courses; 
+0

合体なしでこれを行う方法はありますか?私はそれを学ぶために長くて汚い方法でやりたいと思っています。 – zzzOp

0

あなたはcompound query内で括弧を使用してはならない、と複合クエリの列名は、それだけ内側に最初のクエリによって決定されます。 UNIONは、重複を削除します。重複はNULL値とNULL以外の部分結果が同じ値を持つ場合には不要です。そして、複合問合せは、2つの行を返しますので、あなたは追加の集約を実行する必要があります。

SELECT sum(sum1)/sum(c1) 
FROM (SELECT sum(cap) as sum1, 
      count(*) as c1 
     FROM courses 
     UNION ALL 
     SELECT SUM(null_fields) as sum2, 
      c2 
     FROM (SELECT 10 as null_fields, 
        count(*) as c2 
      FROM courses 
      WHERE cap IS NULL) 
    ); 

と内側のサブクエリは余分ですが、あなたが効率的か、保守がクエリを持ちたいと思いならば、あなたはゴードンのを使用したいです回答。