MySQL如何使用多WHERE条件按县分组统计7个种族总人口


问题解答
不需要为每个种族单独建视图,也不需要写多个WHERE条件反复连表,用条件聚合就能一次性实现按县分组统计所有种族的总人口,比你现在写视图+JOIN的方案更简洁,查询性能也更高。
你当前的写法如果要扩展到7个种族,需要建7个对应种族的视图、做7次表关联,冗余度很高,还容易因为关联匹配问题漏数。直接用CASE WHEN配合聚合函数SUM,单表查询一次就能出结果,参考写法如下:
SELECT county AS County, SUM(CASE WHEN race = 'White, Non-Hispanic' THEN population ELSE 0 END) AS `White pop`, SUM(CASE WHEN race = 'Asian, Non-Hispanic' THEN population ELSE 0 END) AS `Asian pop`, -- 剩余5个种族按照上述格式补充即可,替换成你数据集里实际的race字段值 SUM(CASE WHEN race = 'Black, Non-Hispanic' THEN population ELSE 0 END) AS `Black pop`, SUM(CASE WHEN race = 'Hispanic/Latino' THEN population ELSE 0 END) AS `Hispanic pop`, SUM(CASE WHEN race = 'American Indian/Alaska Native, Non-Hispanic' THEN population ELSE 0 END) AS `AIAN pop`, SUM(CASE WHEN race = 'Native Hawaiian/Pacific Islander, Non-Hispanic' THEN population ELSE 0 END) AS `NHPI pop`, SUM(CASE WHEN race = 'Two or More Races, Non-Hispanic' THEN population ELSE 0 END) AS `Multiracial pop` FROM ca_pop WHERE date_year = '2022' GROUP BY county;
语句逻辑很简单:遍历2022年的所有人口数据时,CASE WHEN会判断当前行的种族,匹配对应种族就把人口数计入对应列,不匹配就计0,最后按县分组求和,就能得到每个县各个种族的总人口。你只需要把上述语句里race =后面的文本替换成你自己数据集里实际存储的7个种族的取值即可。
如果你不需要宽表格式(每个种族单独占一列),想要长表格式(每行对应「某县+某种族」的总人口),写法更简单,不需要手动枚举所有种族:
SELECT county AS County, race AS Race, SUM(population) AS Total_pop FROM ca_pop WHERE date_year = '2022' GROUP BY county, race;
这个写法会自动按县、种族两个维度分组,数据集里存在多少个种族就会输出多少组统计结果。
内容的提问来源于stack exchange,提问作者Anna Quoc Nguyen
相关产品推荐
相关产品推荐

