MySQL avg()和count()在一个语句中使用group by

时间:2015-03-15 18:24:58

标签: mysql

今天我与MySQL战斗:我有两张表,其中包含类似的记录(实际上有更多列,但我认为它并不相关):

表计量:

id, value
1000, 0.117
1000, 0.689
1001, 0.050
...

表格Res(此表中每个ID不超过一条记录):

id, number_residents
1001, 2
...

我尝试按以下格式获得结果:

number_residents, avg, count(id)
2, 0.1234, 456
3, 0.5678, 567
...

用语言:我试图找出具有相同number_residents的 -field的平均值。 id -field是两个表之间的连接。 count(id) - 列应显示已找到该number_residents的ID数。我能提出的问题如下:

select number_residents,count(distinct Metering.id),avg(value)
  from Metering, Res
  where Metering.id = Res.id
  group by number_residents;

结果看起来像我搜索的内容,但当我尝试验证它们时,我变得不安全。我一开始尝试没有 distinct ,但这会导致结果的count-column中的值太高。 我的陈述是否正确得到我想要的东西?我认为它可能需要像执行here这样的执行顺序,但实际上我找不到任何正式的文档...

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

根据表名判断,Res是“父”表,Metering是“子”表 - 即每个住所有0-n计量。

您使用“旧学校”加入(我的意思是 - 加入语法已存在25年了),这是内部加入,意味着住宅没有计量表将不参与结果。

使用外部加入:

select
    number_residents,
    count(distinct r.id) residences_count,
    avg(value) average_value
from Res r
left join Metering m on m.id = r.id
group by number_residents

虽然meterings.id = res.id,但 left 连接计数它们可能会产生不同的结果:我已将计数更改为计算住所,这对于 left 加入意味着没有计量的住宅仍然有效。

现在,nulls(你从没有匹配行的左连接表中得到的)不参与avg() - 如果你想要没有住所的话,你可以参加分子或分母计算平均值时要计算的任何计量(就好像为了划分总值而有一个零计量),请使用此查询:

select
    number_residents,
    count(distinct r.id) residences_count,
    sum(value) / count(r.id) average_value
from Res r
left join Metering m on m.id = r.id
group by number_residents

因为res.id永远不为空,count(r.id)计算每个住宅没有任何计量表的计量数加1。