单列/多列条件SQL查询:统计指定聚合值及通用条件添加
SQL 查询需求解决方案
1. 同时计算全表体重平均值与身高超170cm的行数
要实现仅对单列设置条件(不影响其他列的聚合范围),可以在聚合函数中嵌套 CASE WHEN 来指定条件,无需用 WHERE 过滤整行:
SELECT AVG(weight) AS avg_weight_all, COUNT(CASE WHEN height > 170 THEN 1 END) AS num_height_over_170 FROM `Example`;
AVG(weight)直接计算所有行的体重平均值,不受任何条件限制COUNT(CASE...)仅统计身高>170的行:满足条件时返回1,不满足返回NULL,COUNT会自动忽略NULL值
2. 为不同列设置独立条件(身高超170的行数 + 体重低于60KG的平均值)
同样用 CASE WHEN 为不同聚合逻辑绑定独立条件:
SELECT COUNT(CASE WHEN height > 170 THEN 1 END) AS num_height_over_170, AVG(CASE WHEN weight < 60 THEN weight END) AS avg_weight_under_60 FROM `Example`;
- 体重平均值部分:仅当体重<60时才将该值纳入计算,不满足条件的行返回NULL,
AVG会跳过NULL值
3. 添加通用条件(仅统计姓名以字母a开头的用户)
如果需要对所有聚合结果统一应用过滤条件,直接在 WHERE 子句中添加即可,所有聚合都会基于过滤后的数据集:
SELECT AVG(weight) AS avg_weight, COUNT(CASE WHEN height > 170 THEN 1 END) AS num_height_over_170 FROM `Example` WHERE name LIKE 'a%'; -- 姓名以a开头的通用过滤条件
合并指定的两个查询(修正原错误后)
你提供的第一个查询存在语法逻辑错误(HAVING COUNT(height) > 170 无法正确统计身高超170的行数),修正并合并后的查询如下:
SELECT COUNT(CASE WHEN height > 170 THEN 1 END) AS num_higher_than_170, AVG(weight) AS avg_weight FROM `Example`;
如果原需求是统计身高>170的行的数量,上面的写法是正确的;如果是想统计height列非空且值>170的行数,也可以写成 COUNT(IF(height > 170, 1, NULL))(部分数据库支持IF函数,逻辑和CASE WHEN一致)。
内容的提问来源于stack exchange,提问作者Ohad Shachar
相关产品推荐
相关产品推荐

