根据 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 问题。

干杯, 安琪