Oracle:将条件应用于聚合函数,而不是SQL语句的所有行

Oracle:将条件应用于聚合函数,而不是SQL语句的所有行,sql,oracle,aggregate-functions,Sql,Oracle,Aggregate Functions,我想为Oracle表计算select语句中的最大值,它不是基于查询返回的所有行,而是基于这些行的子集上的条件 我将尝试用一个例子更好地解释: ID | NAME | AGE | COMPANY 1 | Alex | 28 | A 2 | Alan | 22 | A 3 | Bob | 21 | B 4 | Carl | 20 | C 5 | Dave | 24 | C 6 | Eric | 26 | C 7 | Matt | 33 | D 我想获得每个25岁以下

我想为Oracle表计算select语句中的最大值,它不是基于查询返回的所有行,而是基于这些行的子集上的条件

我将尝试用一个例子更好地解释:

ID | NAME | AGE | COMPANY
 1 | Alex | 28  | A
 2 | Alan | 22  | A
 3 | Bob  | 21  | B
 4 | Carl | 20  | C 
 5 | Dave | 24  | C
 6 | Eric | 26  | C
 7 | Matt | 33  | D
我想获得每个25岁以下公司的最大年龄,但我还想计算每个公司的总人数。 所以,我想要这个结果:

COMPANY | DEPENDENTS |  MAX_UNDER_25
   A    |     2      |      22
   B    |     1      |      21
   C    |     3      |      24
   D    |     1      |    (null)
我如何通过一个SQL查询获得这个结果,而不加入记录和的精化和max with条件的精化

我想避免这种选择:

SELECT R1.COMPANY, R1.DEPENDENTS, R2.MAX_UNDER_25 FROM
(SELECT COMPANY, COUNT(*) DEPENDENTS FROM TABLE
GROUP BY COMPANY) R1
LEFT JOIN
(SELECT COMPANY, MAX(AGE) MAX_UNDER_25 FROM TABLE
WHERE AGE < 25
GROUP BY COMPANY) R2
ON R1.COMPANY = R2.COMPANY;
通过一个更简单的查询就可以得到它?

在聚合MAX时只需使用case表达式:

聚合最大值时,只需使用大小写表达式:


将7,Matt,33,D添加到样本数据中,并相应调整预期结果。我已对样本数据编辑了itAdd 7,Matt,33,D,并相应调整了预期结果。我已对其进行了编辑,因此它只需要应用案例条件?我不知道那个把戏。。。我马上试试,我会检查的@亚历山德罗克:什么把戏?你不知道“case”表达式吗?@AlessandroC我以前从未用过这样的case表达式,所以它只需要应用case条件?我不知道那个把戏。。。我马上试试,我会检查的@亚历山德罗克:什么把戏?你不知道“case”这个词吗?@AlessandroC我以前从来没有用过这样的case词
select company, count(*), max(case when age < 25 then age end)
from table
group by company