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

时间:2020-12-29 07:16:37

标签: sql sql-server-2012

问题:使用 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 访问

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

感谢 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 问题。

干杯, 安吉特