如何获得具有特定关系的行的平均值

时间:2014-04-24 00:19:26

标签: mysql sql database average

我有一堆数据存储在数据库中的县人口统计数据中。我需要能够访问某个县的州内的平均数据。 例如,我需要能够得到所有县的平均值,其中state_id匹配县的state_id,其county_id为1.基本上,如果一个县在弗吉尼亚州,我需要所有县的平均值。弗吉尼亚州的县。我在设置此查询时遇到问题,我希望你们能给我一些帮助。这是我写的内容,但它只返回数据库中的一行,因为它将两个表的county_id连接在一起。

SELECT AVG(demographic_data.percent_white) as avg_percent_white 
FROM demographic_data,counties, states 
WHERE counties.county_id = demographic_data.county_id AND counties.state_id = states.state_id

这是我的基本数据库布局:

counties
------------------------
county_id | county_name

states
---------------------
state_id | state_name

demographic_data
-----------------------------------------
percent_white | percent_black | county_id

1 个答案:

答案 0 :(得分:1)

您的查询返回一行,因为有一个聚合而没有GROUP BY。如果你想要一个州内所有县的平均值,我们只期望一行。

要获得州内所有县的“全州”平均值,这是一种方法:

SELECT AVG(d.percent_white) AS avg_percent_white
  FROM demographic_data d
  JOIN counties a
    ON a.county_id = d.county_id
  JOIN counties o
    ON o.state_id = a.state_id 
 WHERE o.county_id = 42

请注意,无需加入state表。你只需要所有具有匹配state_id的县。上面的查询使用了对县表的两个引用。别名为“a”的引用是针对某个州内的所有县的,引用别名为“o”是为了获取特定县的state_id。

如果您已经拥有state_id,则不需要第二个引用:

SELECT AVG(d.percent_white) AS avg_percent_white
  FROM demographic_data d
  JOIN counties a
    ON a.county_id = d.county_id
 WHERE a.state_id = 11

<强>后续

如果我想引入另一张桌子怎么办?我们称之为demographic_data_2,它也是通过county_id链接的

A 我假设demographic_data表每个county_id有一行。如果对于第二个表同样适用,则进行简单的JOIN操作。

  JOIN demographic_data_2 c
    ON c.county_id = d.county_id 

加入该表后,您可以在SELECT列表中添加适当的聚合表达式(例如SUM,MIN,MAX,AVG)。

故障点通常是“缺失”和“重复”数据......当第二个表中的每个county_id都没有行,或者某个county_id有多个行时,会导致行不行包括在汇总中,或在汇总中加倍计算。


我们注意到原始查询中返回的聚合是“平均值”。它是每个县的平均值。

考虑:

bucket  count_red  count_blue  count_total  percent_red
------  ---------  ----------  -----------  -----------
     1        480           4         1000           48
     2         60           1          200           30

请注意,“平均值”与使用总数计算平均值之间存在差异。

SELECT AVG(percent_red) AS avg_percent_red
     , SUM(count_red)/SUM(count_total) AS tot_percent_red

avg_percent_red  tot_percent_red
---------------  ---------------
             39               45

这两个值都有效,我们只是不想误解或歪曲这两个值。