Oracle SQL如何按STUDENT_ID分组并过滤存在空STIP_ID的学生
Oracle SQL 聚合函数实现方案
核心思路
利用COUNT()聚合函数的特性:COUNT(指定字段)统计时会自动忽略该字段为NULL/空值的行,当分组内所有行的STIP_ID都非空时,COUNT(STIP_ID)的统计结果会等于分组的总行数COUNT(*)。
实现代码
SELECT STUDENT_ID, FULL_NAME FROM 你的表名 GROUP BY STUDENT_ID, FULL_NAME HAVING COUNT(STIP_ID) = COUNT(*);
逻辑说明
- 分组时同时指定
STUDENT_ID和FULL_NAME,二者为一一对应关系,满足分组后直接返回这两个字段的要求 HAVING子句作为分组后过滤条件:只要学生存在任意一学期STIP_ID为空,COUNT(STIP_ID)的统计值就会小于分组总行数COUNT(*),对应分组就会被排除
可选实现(逻辑更直观)
如果需要更明确的空值判断逻辑,也可以结合CASE WHEN和MAX聚合函数实现:
SELECT STUDENT_ID, FULL_NAME FROM 你的表名 GROUP BY STUDENT_ID, FULL_NAME HAVING MAX(CASE WHEN STIP_ID IS NULL THEN 1 ELSE 0 END) = 0;
该方案逻辑为:只要分组内存在任意一行STIP_ID为空,MAX()统计结果就为1,不符合等于0的过滤条件,对应分组就会被排除。
内容的提问来源于stack exchange,提问作者Utilka
相关产品推荐
相关产品推荐

