根据 SQL table 中 (A) 列中的公共值合并 (B) 列中的值
Merge values in a column (B) based on common values in column (A) in SQL table
问题:使用SQL,您将如何根据列(A) 中的公共值合并列(B) 中的值?
Table结构:我有一个SQLtable(如下所示),其中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
预期最终结果:结果 table 应如下所示 table:
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
在标准 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
我无法在结果中获得 Carriage Return,看起来像是 SSMS 问题。
干杯,
安琪
问题:使用SQL,您将如何根据列(A) 中的公共值合并列(B) 中的值?
Table结构:我有一个SQLtable(如下所示),其中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 |
预期最终结果:结果 table 应如下所示 table:
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 |
在标准 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
我无法在结果中获得 Carriage Return,看起来像是 SSMS 问题。
干杯, 安琪