2011-10-25 12 views
10

現在、私は各モジュールのリソース数の平均を求める代入に取り組んでいます。現在のテーブルは次のようになります。同じクエリのcount()の平均値

ResourceID ModulID 
    1   1 
    2   7 
    3   2 
    4   4 
    5   1 
    6   1 

だから、基本的に、私は、リソースの平均数を取得する方法を把握しようとしています。関連するテストデータはここでは のみです。モジュール1には、3つの異なるリソースが接続されています。しかし、私はすべての結果を表示する必要があります。

これは私のコードです:

select avg(a.ress) GjSnitt, modulID 
from 
(select count(ressursID) as ress 
from ressursertiloppgave 
group by modulID) as a, ressursertiloppgave r 
group by modulID; 

は明らかにそれが動作していないが、私はこの時点で変更するものに損失で、現在です。私は本当に皆さんのご意見をお待ちしております。

+0

は、あなたは自分の外側のクエリ( 'AVGを(使用できません) 'をModulIdでグループ化して)内部クエリを使用しないでください。私はそれが期待される結果を生むだろうと思うだろう。 –

+0

AVG()の問題は、値をまとめて1つの値の平均値にすることです。一例として、リソース1,5と6は12となります。次に平均合計を取るためにそれが使用されます。 ModulID 1に3つのresourceIDが接続されているので、1.5にする必要があります。 – Coss

答えて

21

これは実行しているクエリで、やや鈍い構文で記述されています。

SELECT 
    avg(a.ress) as GjSnitt 
    , modulID 
FROM 
    (SELECT COUNT(ressursID) as ress 
    FROM ressursertiloppgave 
    GROUP BY modulID) as a 
CROSS JOIN ressursertiloppgave r <--- Cross join are very very rare! 
GROUP BY modulID; 

あなたは、テーブルを結合する合計(6×6 =)36行を作り、4にこのダウン凝縮クロスであるが、合計数が36であるため、結果は間違っています。
このため、暗黙的な結合を使用しないでください。

にクエリを書き直し

:あなたが一番下にある個々の行数平均をない場合

SELECT AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r 
    GROUP BY r.ModulID) a 

SELECT r1.ModulID, count(*) as rcount 
FROM ressursertiloppgave r1 
GROUP BY r1.ModulID 
UNION ALL 
    SELECT 'avg = ', AVG(a.rcount) FROM 
    (select count(*) as rcount 
    FROM ressursertiloppgave r2 
    GROUP BY r2.ModulID) a 
+0

正しい結果を表示する最初のmodulIDの値を取得します。しかし、残りのmodulIDをどのようにして取得するのですか? modulIDを最初の選択に含め、modulIDでグループ化すると、すべてのmodulIDで同じ結果が表示されます。 – Coss

+0

@Coss、更新された質問を参照してください。 – Johan

+0

ああ、私は見る!しかし、私は私の質問で不器用だったと思う。私が探しているのは、可能ならば、すべての行数の平均です。 – Coss

関連する問題