SQL Developer中如何将同一患者的多行保险数据合并到单个单元格?
嘿,这个需求在数据处理里挺常见的,不同数据库有对应的实现方法,我给你整理了几种主流数据库的解决方案:
分数据库实现合并逻辑
MySQL/MariaDB
直接用GROUP_CONCAT函数就能搞定,这是MySQL专门用来拼接分组内字符串的工具:
SELECT PAT_ID, GROUP_CONCAT(INS SEPARATOR '; ') AS INS FROM your_table_name GROUP BY PAT_ID;
简单说就是按PAT_ID分组,把每组里的INS值用; 连接起来,刚好符合你要的格式。要是担心有重复的保险值,可以加个DISTINCT在INS前面,比如GROUP_CONCAT(DISTINCT INS SEPARATOR '; ')。
SQL Server
如果是2017及以后的版本,用STRING_AGG函数超方便:
SELECT PAT_ID, STRING_AGG(INS, '; ') AS INS FROM your_table_name GROUP BY PAT_ID;
要是用的是2016及更早的老版本,就得用STUFF搭配FOR XML PATH的组合写法了:
SELECT DISTINCT PAT_ID, STUFF( (SELECT '; ' + INS FROM your_table_name t2 WHERE t2.PAT_ID = t1.PAT_ID FOR XML PATH('')), 1, 2, '' ) AS INS FROM your_table_name t1;
这里FOR XML PATH('')会把同ID的保险值拼接成一串带; 开头的字符串,STUFF就是把开头多余的; 去掉。
Oracle
Oracle 11g及以后可以用LISTAGG函数,还能指定拼接顺序:
SELECT PAT_ID, LISTAGG(INS, '; ') WITHIN GROUP (ORDER BY INS) AS INS FROM your_table_name GROUP BY PAT_ID;
里面的ORDER BY INS是可选的,要是你不需要按保险名称排序,直接去掉就行。
小提醒
- 记得把代码里的
your_table_name换成你实际的表名哦 - 如果
INS字段可能有空值,建议加个WHERE INS IS NOT NULL过滤,避免拼接出无效的空内容 - 部分数据库对拼接后的字符串长度有默认限制,比如MySQL的
GROUP_CONCAT默认是1024字符,要是需要更长可以提前设置参数:SET GROUP_CONCAT_MAX_LEN = 1000000;
内容的提问来源于stack exchange,提问作者Chris Jones
相关产品推荐
相关产品推荐

