问题描述
问题:使用 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 问题。
干杯, 安吉特