[英]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 ![]() |
TEXT![]() |
RANK_ORDER![]() |
---|---|---|
ABC001 ![]() |
ID: ABC001 - NEAREST LANDMARK - SHOPPING CENTRE ![]() |
-999 ![]() |
ABC001 ![]() |
TRAVEL 80 M NORTH FROM SC![]() |
-900 ![]() |
ABC001 ![]() |
THROUGH PEDESTRIAN CROSSING![]() |
10.1 ![]() |
ABC002 ![]() |
ID: ABC002 - NEAREST LANDMARK - PUBLIC TOILET ![]() |
-999 ![]() |
ABC002 ![]() |
TRAVEL 150 M NORTH FROM SC![]() |
-900 ![]() |
ABC002 ![]() |
THROUGH PARK ACCESS RD![]() |
10.1 ![]() |
ABC003 ![]() |
ID: ABC003 - NEAREST LANDMARK - REHABILITATION CENTRE ![]() |
-999 ![]() |
ABC003 ![]() |
TRAVEL 1300M WEST FROM RC![]() |
-900 ![]() |
ABC003 ![]() |
THROUGH UNMADE RD![]() |
10.1 ![]() |
ABC003 ![]() |
LOCKED GATES![]() |
10.5 ![]() |
ABC003 ![]() |
CALL RC FOR ACCESS![]() |
20.1 ![]() |
Expected End Result : The resultant table should look like the table shown below:预期的最终结果:结果表应如下所示:
ID ![]() |
TEXT![]() |
---|---|
ABC001 ![]() |
ID: ABC001 - NEAREST LANDMARK - SHOPPING CENTRE ![]() TRAVEL 80 M NORTH FROM SC ![]() THROUGH PEDESTRIAN CROSSING ![]() |
ABC002 ![]() |
ID: ABC002 - NEAREST LANDMARK - PUBLIC TOILET ![]() TRAVEL 150 M NORTH FROM SC ![]() THROUGH PARK ACCESS RD ![]() |
ABC003 ![]() |
ID: ABC003 - NEAREST LANDMARK - REHABILITATION CENTRE ![]() TRAVEL 1300M WEST FROM RC ![]() THROUGH UNMADE RD ![]() LOCKED GATES ![]() CALL RC FOR ACCESS ![]() |
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.