Oracle基于行子集条件聚合:求各公司25岁以下最大年龄及总人数
解决方案:Oracle中按行子集计算最大值并统计总人数
针对你的需求,我们可以结合Oracle的聚合函数和条件判断来实现——既统计每个公司的总人数,又只针对25岁以下人员的子集计算最大年龄。
实现SQL语句
SELECT COMPANY, COUNT(*) AS 总人数, MAX(CASE WHEN AGE < 25 THEN AGE END) AS 25岁以下最大年龄 FROM 你的表名 GROUP BY COMPANY ORDER BY COMPANY;
语句解释
COUNT(*):直接统计每个分组(公司)下的所有行数,也就是该公司的总人数。MAX(CASE WHEN AGE < 25 THEN AGE END):通过CASE语句筛选出年龄小于25的行,只对这些行的AGE字段取最大值;如果某个公司没有25岁以下的员工,这个字段会返回NULL,符合实际逻辑。GROUP BY COMPANY:按公司分组,确保每个公司只返回一行统计结果。
针对示例数据的执行结果
按照你给出的示例数据,执行上述SQL后会得到如下结果:
| COMPANY | 总人数 | 25岁以下最大年龄 |
|---|---|---|
| A | 2 | 22 |
| B | 1 | 21 |
| C | 3 | 24 |
| D | 1 | NULL |
可选优化:替换NULL值
如果希望把没有25岁以下员工的公司对应的最大值显示为0(或其他默认值),可以用NVL函数包装最大值计算:
SELECT COMPANY, COUNT(*) AS 总人数, NVL(MAX(CASE WHEN AGE < 25 THEN AGE END), 0) AS 25岁以下最大年龄 FROM 你的表名 GROUP BY COMPANY ORDER BY COMPANY;
这样公司D的25岁以下最大年龄就会显示为0,而不是NULL。
内容的提问来源于stack exchange,提问作者Alessandro C
相关产品推荐
相关产品推荐

