2014-04-24 44 views
1

我有一堆数据存储在数据库中与县人口统计有关。我需要能够访问某个县的州内的平均数据。 例如,我需要能够得到state_id与county_id为1的县的state_id相匹配的所有县的平均值。基本上,如果某个县在弗吉尼亚州,我需要所有县的平均值弗吉尼亚州。我在设置这个查询时遇到了麻烦,我希望你们可以给我一些帮助。这是我写的内容,但它只返回数据库中的一行,因为它将两个表的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

您的查询返回一行,因为有一个聚集并没有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 

随访

Q如果我想在另一个表带上。 。我们将其称为demographic_data_2,它也通过县代码链接

A我假设demographic_data表每县county_id有一行。如果第二个表格适用,则执行一个简单的JOIN操作。

JOIN demographic_data_2 c 
    ON c.county_id = d.county_id 

与该表加入进来,你可以在SELECT列表(例如SUM,MIN,MAX,AVG)添加适当的聚合表达式。

故障点通常是“丢失”和“重复”的数据......当第二个表中的每个县的行都没有一行时,或者对于某个特定的县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 

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

+0

好..我有一个最后一个问题..如果我想引入另一张桌子怎么办?我们称之为demographic_data_2,它也通过county_id链接 – user3566753