如何通过同表Left Join合并多维度统计查询结果
合并SQL查询实现多维度学校统计需求
我来帮你解决这个SQL合并查询的问题——你需要的是在一个GROUP BY语句里一次性计算出所有需要的统计指标,而不是分开查询再合并,这样既高效又不会出问题。
原始表结构与数据
| 姓名(FName) | 学校(School) | 性别(Gender) | 项目(Events) | 项目2(Events2) | 项目3(Events3) |
|---|---|---|---|---|---|
| Ann | Marymount | F | HJ | LJ | TJ |
| Peter | Marymount | M | 100 | 200 | 400 |
| Drew | St Hughs | M | 100 | 200 | |
| Davis | St Hughs | M | 200 | ||
| Kat | Campion | F | 400 | ||
| Molly | Campion | F | 400 | ||
| Mike | Marymount | M | 800 | ||
| Fran | Campion | M | 100 | 200 |
现有查询的问题分析
你之前的两个独立查询存在几个关键问题:
- 查询2的WHERE子句逻辑错误:
(school <> 'Unattached') AND (Events = '100') OR (Events2 = '100') OR (Events3 = '100')由于AND优先级高于OR,实际会匹配(非Unattached学校且Events=100)或者Events2=100或者Events3=100的所有记录,这会包含其他学校的不符合条件的数据。 - 统计'100'次数的方式错误:
COUNT(Events + Events2 + Events3)是字符串拼接后的统计,完全无法准确计算三个列中'100'的出现次数。 - 分开查询合并的问题:两个查询的输出列结构和含义不同,用UNION合并会导致结果混乱;LEFT JOIN如果关联逻辑不对,也无法得到正确的合并结果。
正确的合并查询方案
只需要一个GROUP BY语句就能一次性计算所有指标,核心是用SUM(CASE...)的方式统计每个列中'100'的出现次数,再求和:
SELECT school AS `学校(School)`, COUNT(FName) AS `参与者数量`, COUNT(DISTINCT Gender) AS `性别种类数`, SUM( CASE WHEN Events = '100' THEN 1 ELSE 0 END + CASE WHEN Events2 = '100' THEN 1 ELSE 0 END + CASE WHEN Events3 = '100' THEN 1 ELSE 0 END ) AS `'100'项目次数` FROM entries WHERE school <> 'Unattached' GROUP BY school;
结果验证
执行这个查询后,会得到你期望的结果:
| 学校(School) | 参与者数量 | 性别种类数 | '100'项目次数 |
|---|---|---|---|
| Marymount | 3 | 2 | 1 |
| St Hughs | 2 | 1 | 1 |
| Campion | 3 | 2 | 1 |
关键逻辑解释
COUNT(FName):统计每个学校的参与者数量(假设FName不为空,也可以用COUNT(*),效果一致)COUNT(DISTINCT Gender):去重统计每个学校的性别种类数SUM(CASE...):对每个项目列单独判断是否为'100',是则加1,否则加0,最后求和得到所有'100'的总出现次数
内容的提问来源于stack exchange,提问作者catrat
相关产品推荐
相关产品推荐

