简体   繁体   English

根据 SQL 表中 (A) 列中的常用值合并列 (B) 中的值

[英]Merge values in a column (B) based on common values in column (A) in SQL table

Question : Using SQL, how would you Merge values in a column (B) based on common values in column (A)?问题:使用 SQL,您将如何根据列 (A) 中的常用值合并列 (B) 中的值?

Table Structure : I have a SQL table (shown below), where Column A has ID's and Column B contains Text related to ID's and Column C contains Rank Order ( the order in which text should be should be sorted ).表结构:我有一个 SQL 表(如下所示),其中A 列有 ID, B 列包含与 ID 相关的文本, C 列包含排名顺序(应该对文本进行排序的顺序)。

ID ID TEXT文本 RANK_ORDER排序
ABC001 ABC001 ID: ABC001 - NEAREST LANDMARK - SHOPPING CENTRE ID: ABC001 - 最近的地标 - 购物中心 -999 -999
ABC001 ABC001 TRAVEL 80 M NORTH FROM SC从 SC 向北行驶 80 M -900 -900
ABC001 ABC001 THROUGH PEDESTRIAN CROSSING通过人行横道 10.1 10.1
ABC002 ABC002 ID: ABC002 - NEAREST LANDMARK - PUBLIC TOILET ID: ABC002 - 最近的地标 - 公共厕所 -999 -999
ABC002 ABC002 TRAVEL 150 M NORTH FROM SC从 SC 向北行驶 150 M -900 -900
ABC002 ABC002 THROUGH PARK ACCESS RD通过公园访问路 10.1 10.1
ABC003 ABC003 ID: ABC003 - NEAREST LANDMARK - REHABILITATION CENTRE ID: ABC003 - 最近的地标 - 康复中心 -999 -999
ABC003 ABC003 TRAVEL 1300M WEST FROM RC从 RC 向西行驶 1300M -900 -900
ABC003 ABC003 THROUGH UNMADE RD通过未制造的 RD 10.1 10.1
ABC003 ABC003 LOCKED GATES上锁的大门 10.5 10.5
ABC003 ABC003 CALL RC FOR ACCESS呼叫 RC 访问 20.1 20.1

Expected End Result : The resultant table should look like the table shown below:预期的最终结果:结果表应如下所示:

ID ID TEXT文本
ABC001 ABC001 ID: ABC001 - NEAREST LANDMARK - SHOPPING CENTRE ID: ABC001 - 最近的地标 - 购物中心
TRAVEL 80 M NORTH FROM SC从 SC 向北行驶 80 M
THROUGH PEDESTRIAN CROSSING通过人行横道
ABC002 ABC002 ID: ABC002 - NEAREST LANDMARK - PUBLIC TOILET ID: ABC002 - 最近的地标 - 公共厕所
TRAVEL 150 M NORTH FROM SC从 SC 向北行驶 150 M
THROUGH PARK ACCESS RD通过公园访问路
ABC003 ABC003 ID: ABC003 - NEAREST LANDMARK - REHABILITATION CENTRE ID: ABC003 - 最近的地标 - 康复中心
TRAVEL 1300M WEST FROM RC从 RC 向西行驶 1300M
THROUGH UNMADE RD通过未制造的 RD
LOCKED GATES上锁的大门
CALL RC FOR ACCESS呼叫 RC 访问

In standard SQL, you can represent this as:在标准 SQL 中,您可以将其表示为:

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

Although most databases support this functionality, the exact syntax depends on the database -- as does inserting a newline character (which might also depend on the operating system).尽管大多数数据库都支持此功能,但确切的语法取决于数据库——插入换行符也是如此(这也可能取决于操作系统)。

Thanks Gordon, LISTAGG Works on SQLServer 2016 onwards, where I am on SQLServer 2012. But I found STRING_AGG works well.谢谢 Gordon,LISTAGG 可以在 SQLServer 2016 及更高版本上运行,而我在 SQLServer 2012 上。但我发现STRING_AGG运行良好。 The following query is the solution.以下查询是解决方案。

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

I am unable to get Carriage Return in results, it looks like SSMS issue.我无法在结果中获得回车,它看起来像 SSMS 问题。

Cheers, Ankit干杯, Ankit

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM