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

单列/多列条件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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:01:06