按SEQUENCE与CREATEDATE合并多行数据至单列的SQL问题
SQL分组拼接TEXT字段解决方案
现有表结构
| PK_ID | FK_ID | SEQUENCE | TEXT | CREATEDATE | UPDATEDATE |
|---|---|---|---|---|---|
| 1233456 | 5895552 | 1 | This is | 12-JAN-22 | 13-JAN-22 |
| 1233457 | 5895552 | 2 | a SQLL | 12-JAN-22 | 13-JAN-22 |
| 1233458 | 5895552 | 1 | This is | 13-JAN-22 | 14-JAN-22 |
| 1233459 | 5895552 | 2 | a SQL | 13-JAN-22 | 14-JAN-22 |
| 1233460 | 5895552 | 1 | This is | 14-JAN-22 | 15-JAN-22 |
| 1233461 | 5895552 | 2 | a SQL.com | 14-JAN-22 | 15-JAN-22 |
| 1233462 | 5895552 | 1 | This is | 15-JAN-22 | |
| 1233463 | 5895552 | 2 | a SQLcom | 15-JAN-22 |
需求说明
按SEQUENCE和CREATEDATE对TEXT字段分组合并(UPDATEDATE为NULL代表当前记录),最终结果按CREATEDATE排序。曾尝试使用FOR XML PATH和STUFF实现,但因日期分组逻辑问题无法得到预期输出。
预期输出
| FK_ID | TEXT | CREATEDATE |
|---|---|---|
| 5895552 | This is a SQLL | 12-JAN-22 |
| 5895552 | This is a SQL | 13-JAN-22 |
| 5895552 | This is a SQL.com | 14-JAN-22 |
| 5895552 | This is a SQLcom | 15-JAN-22 |
可行SQL方案
方案1:SQL Server 2017+版本(简洁高效)
使用STRING_AGG函数直接完成分组拼接:
SELECT FK_ID, STRING_AGG(TEXT, ' ') WITHIN GROUP (ORDER BY SEQUENCE) AS TEXT, CREATEDATE FROM YourTableName -- 替换为你的实际表名 GROUP BY FK_ID, CREATEDATE ORDER BY CREATEDATE;
方案2:低版本SQL Server(兼容旧环境)
使用STUFF+FOR XML PATH组合实现拼接:
SELECT DISTINCT FK_ID, STUFF(( SELECT ' ' + TEXT FROM YourTableName t2 WHERE t2.FK_ID = t1.FK_ID AND t2.CREATEDATE = t1.CREATEDATE ORDER BY t2.SEQUENCE FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') AS TEXT, CREATEDATE FROM YourTableName t1 -- 替换为你的实际表名 ORDER BY CREATEDATE;
方案说明
两种方案均以FK_ID和CREATEDATE作为核心分组条件,在每个分组内严格按SEQUENCE顺序拼接TEXT字段,最终按CREATEDATE排序输出,完全匹配预期结果。之前的问题大概率是未正确以CREATEDATE作为分组维度,或者拼接时未指定SEQUENCE的排序规则。
内容的提问来源于stack exchange,提问作者ajaloha
相关产品推荐
相关产品推荐

