2011-10-25 28 views
10

我目前正在处理一个任务,这个任务需要我找到每个模块资源数量的平均值。目前的表如下所示:在同一个查询中计数的平均值()

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,5和6生成12,然后用它来取平均值。我需要它是1.5,因为有3个resourceID连接到ModulID 1. – 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 =)总共和冷凝下来到4 36行,但由于总数是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