You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过同表Left Join合并多维度统计查询结果

合并SQL查询实现多维度学校统计需求

我来帮你解决这个SQL合并查询的问题——你需要的是在一个GROUP BY语句里一次性计算出所有需要的统计指标,而不是分开查询再合并,这样既高效又不会出问题。

原始表结构与数据

姓名(FName)学校(School)性别(Gender)项目(Events)项目2(Events2)项目3(Events3)
AnnMarymountFHJLJTJ
PeterMarymountM100200400
DrewSt HughsM100200
DavisSt HughsM200
KatCampionF400
MollyCampionF400
MikeMarymountM800
FranCampionM100200

现有查询的问题分析

你之前的两个独立查询存在几个关键问题:

  1. 查询2的WHERE子句逻辑错误:(school <> 'Unattached') AND (Events = '100') OR (Events2 = '100') OR (Events3 = '100') 由于AND优先级高于OR,实际会匹配(非Unattached学校且Events=100) 或者 Events2=100 或者 Events3=100的所有记录,这会包含其他学校的不符合条件的数据。
  2. 统计'100'次数的方式错误:COUNT(Events + Events2 + Events3)是字符串拼接后的统计,完全无法准确计算三个列中'100'的出现次数。
  3. 分开查询合并的问题:两个查询的输出列结构和含义不同,用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'项目次数
Marymount321
St Hughs211
Campion321

关键逻辑解释

  • COUNT(FName):统计每个学校的参与者数量(假设FName不为空,也可以用COUNT(*),效果一致)
  • COUNT(DISTINCT Gender):去重统计每个学校的性别种类数
  • SUM(CASE...):对每个项目列单独判断是否为'100',是则加1,否则加0,最后求和得到所有'100'的总出现次数

内容的提问来源于stack exchange,提问作者catrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:45:28