如何在Oracle SQL中转置结果:一个唯一ID对应非空列单行展示
Oracle SQL 合并同一unique_id的多行数据
直接用聚合函数+分组就能解决你的问题,修改后的SQL如下:
SELECT unique_id, MAX(CASE WHEN type LIKE 'E-%' THEN 'electric' END) AS electric_flag, MAX(CASE WHEN type LIKE 'G-%' THEN 'gas' END) AS gas_flag, MAX(CASE WHEN type LIKE 'W-%' THEN 'water' END) AS water_flag, MAX(CASE WHEN type LIKE 'S-%' THEN 'wastewater' END) AS wastewater_flag FROM (SELECT unique_id, type, end_dt FROM table WHERE end_dt IS NULL) t GROUP BY unique_id HAVING MAX(CASE WHEN type LIKE 'E-%' THEN 'electric' END) IS NOT NULL OR MAX(CASE WHEN type LIKE 'G-%' THEN 'gas' END) IS NOT NULL OR MAX(CASE WHEN type LIKE 'W-%' THEN 'water' END) IS NOT NULL OR MAX(CASE WHEN type LIKE 'S-%' THEN 'wastewater' END) IS NOT NULL;
关键逻辑说明:
MAX()聚合函数:同一unique_id下,每个标志列只会有一个非空值(对应匹配的type),MAX()会自动忽略NULL,保留唯一的有效取值,从而把多行合并成一行。GROUP BY unique_id:按unique_id分组,让同一ID的所有行参与聚合计算。HAVING子句:过滤掉所有标志列都为NULL的分组,也就是没有匹配任何type规则的无效行,满足你“忽略全NULL行”的需求。
另外,原代码里的ELSE null可以省略,因为CASE表达式默认不匹配时就返回NULL,这样代码更简洁。
内容的提问来源于stack exchange,提问作者bmax
相关产品推荐
相关产品推荐

