我有一堆数据存储在数据库中的县人口统计数据中。我需要能够访问某个县的州内的平均数据。 例如,我需要能够得到所有县的平均值,其中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
答案 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
这两个值都有效,我们只是不想误解或歪曲这两个值。