基于 SQL 表中列 (A) 中的公共值合并列 (B) 中的值

问题描述

问题:使用 sql,您将如何根据列 (A) 中的公共值合并列 (B) 中的值?

表结构我有一个 sql 表(如下所示),其中 A 列 有 ID,B 列 包含与 ID 相关的文本并且C 列 包含排名顺序(应该对文本进行排序的顺序)。

ID TEXT RANK_ORDER
ABC001 ID:ABC001 - 最近的地标 - 购物中心 -999
ABC001 从南卡罗来纳州向北行驶 80 M -900
ABC001 通过人行横道 10.1
ABC002 ID:ABC002 - 最近的地标 - 公共厕所 -999
ABC002 从南卡罗来纳州向北行驶 150 M -900
ABC002 通过公园入口路 10.1
ABC003 ID:ABC003 - 最近的地标 - 康复中心 -999
ABC003 从 RC 向西行驶 1300 米 -900
ABC003 THROUGH UNMADE RD 10.1
ABC003 锁定门 10.5
ABC003 呼叫 RC 访问 20.1

预期的最终结果:结果表应如下所示:

ID 文本
ABC001 ID:ABC001 - 最近的地标 - 购物中心
从 SC 向北行驶 80 M
通过人行横道
ABC002 ID:ABC002 - 最近的地标 - 公共厕所
从 SC 向北行驶 150 M
通过 Park ACCESS RD
ABC003 ID:ABC003 - 最近的地标 - 康复中心
从 RC 向西行驶 1300 米
通过未修好的路
锁着的大门
呼叫 RC 访问

解决方法

在标准 SQL 中,您可以将其表示为:

select id,listagg(text,'; ') within group (order by rank_order) as text
from t
group by id;

尽管大多数数据库都支持此功能,但确切的语法取决于数据库——插入换行符也是如此(这也可能取决于操作系统)。

,

感谢 Gordon,LISTAGG 从 SQLServer 2016 开始工作,我在 SQLServer 2012 上工作。 但我发现 STRING_AGG 效果很好。以下查询是解决方案。

    select ID,STRING_AGG(TEXT,CHAR(13)) within group (Order by RANK_ORDER) as TEXT
    from t
    GROUP BY ID

我无法在结果中获得回车,看起来像是 SSMS 问题。

干杯, 安吉特