如何用查询将多行数据的ACCUM_PROVSN_TY字段值合并为单个字段
数据合并需求及实现方案
原始数据
ACCT_NUM BEN_OPT_CD BEN_PLN_TY ACCUM_PROVSN_TY 0000025 CO1E MHRD 2 0000025 CO1E MHRD 3 0000025 CO1E RXRD 1 0000025 CO1EF MHRD 2 0000025 CO1EF MHRD 3 0000025 CO1EF RXRD 3 0000025 CO1EL MHRD 1 0000025 CO1EL MHRD 4 0000025 CO1EL RXRD 3 0000025 CO1EN MHRD 1 0000025 CO1EN MHRD 2 0000025 CO1EN MHRD 3 0000025 CO1EN RXRD 3
目标结果
将同一ACCT_NUM、BEN_OPT_CD、BEN_PLN_TY分组下的ACCUM_PROVSN_TY值合并为逗号分隔的字符串,结果如下:
ACCT_NUM BEN_OPT_CD BEN_PLN_TY ACCUM_PROVSN_TY 0000025 CO1E MHRD 2, 3 0000025 CO1E RXRD 1 0000025 CO1EF MHRD 2, 3 0000025 CO1EF RXRD 3 0000025 CO1EL MHRD 1, 4 0000025 CO1EL RXRD 3 0000025 CO1EN MHRD 1, 2, 3 0000025 CO1EN RXRD 3
注:表记录数不足50万,无需考虑性能问题;最终ACCUM_PROVSN_TY字段值最多包含4个数字。
不同数据库的实现代码
MySQL/MariaDB
使用GROUP_CONCAT函数,支持排序和自定义分隔符:
SELECT ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY, GROUP_CONCAT(ACCUM_PROVSN_TY ORDER BY ACCUM_PROVSN_TY SEPARATOR ', ') AS ACCUM_PROVSN_TY FROM your_table GROUP BY ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY;
Oracle
使用LISTAGG函数实现字符串聚合:
SELECT ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY, LISTAGG(ACCUM_PROVSN_TY, ', ') WITHIN GROUP (ORDER BY ACCUM_PROVSN_TY) AS ACCUM_PROVSN_TY FROM your_table GROUP BY ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY;
SQL Server(2017+)
使用STRING_AGG函数:
SELECT ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY, STRING_AGG(ACCUM_PROVSN_TY, ', ') WITHIN GROUP (ORDER BY ACCUM_PROVSN_TY) AS ACCUM_PROVSN_TY FROM your_table GROUP BY ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY;
PostgreSQL
使用STRING_AGG函数,需将数值类型转为文本:
SELECT ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY, STRING_AGG(ACCUM_PROVSN_TY::TEXT, ', ') ORDER BY ACCUM_PROVSN_TY AS ACCUM_PROVSN_TY FROM your_table GROUP BY ACCT_NUM, BEN_OPT_CD, BEN_PLN_TY;
内容的提问来源于stack exchange,提问作者Johnny Bones
相关产品推荐
相关产品推荐

