如何在Oracle SQL中将缺失属性分组至单列?附示例表与预期结果
嘿,这需求我熟!咱们可以用Oracle的LISTAGG字符串拼接函数结合UNION ALL来实现,完美匹配你要的输出格式。
Oracle SQL:汇总缺失属性的员工ID
首先先明确你的源表结构和数据:
| empid | name | dept | ph_no |
|---|---|---|---|
| 123 | null | null | null |
| 124 | mike | science | null |
| 125 | null | physics | 789 |
| 126 | null | null | 463 |
| 127 | john | null | null |
实现代码
直接上可以运行的SQL:
SELECT LISTAGG(empid, ', ') WITHIN GROUP (ORDER BY empid) || ' 缺失name' AS status FROM emp WHERE name IS NULL UNION ALL SELECT LISTAGG(empid, ', ') WITHIN GROUP (ORDER BY empid) || ' 缺失dept' AS status FROM emp WHERE dept IS NULL UNION ALL SELECT LISTAGG(empid, ', ') WITHIN GROUP (ORDER BY empid) || ' 缺失ph_no' AS status FROM emp WHERE ph_no IS NULL;
代码逻辑说明
- 分三个独立查询分别处理
name、dept、ph_no三个字段的缺失情况:每个查询先筛选出对应字段为NULL的员工记录。 LISTAGG(empid, ', ') WITHIN GROUP (ORDER BY empid):这个函数的作用是把符合条件的员工ID按从小到大的顺序拼接成逗号加空格分隔的字符串,和你示例里的格式完全对齐。- 最后拼接上固定文本“ 缺失XX”,生成你需要的
status列内容。 - 用
UNION ALL把三个查询的结果合并,得到最终的三行汇总结果。
运行结果
执行后会得到和你预期完全一致的输出:
status ------------ 123, 125, 126 缺失name 123, 126, 127 缺失dept 123, 124, 127 缺失ph_no
内容的提问来源于stack exchange,提问作者stephenjacob
相关产品推荐
相关产品推荐

