繁体   English   中英

按 n 组记录将行转换为逗号分隔的字符串

[英]Transform rows to comma delimited string by groups of n records

基于此样本表

ID 姓名 ZIP NTID
1 胡安 123 H1
1 胡安 123 H2
2 约翰 456 H3
2 约翰 456 H4
2 约翰 456 H5

我想将ntid显示为逗号分隔值,但最多包含 2 个项目

预期结果

ID 姓名 ZIP NTID
1 胡安 123 H1, H2
2 约翰 456 H3、H4
2 约翰 456 H5

使用 SQL 服务器,有没有办法做到这一点?

通过使用STRING_AGG function 它将所有内容连接在一行中,但我需要分组为最多 2 个成员的组。

SELECT ID, NAME, ZIP, STRING_AGG(NTID,',')
FROM MyTable
GROUP BY ID, NAME, ZIP

因此,您可以使用修改后的行号(除以 2)将数据分组为 2 行块,然后可以使用string_agg()

您确实需要一种对行进行排序的方法(如果您想要一致的结果),我假设NTID会起作用,但您可能有更好的列来排序。

declare @Test table (ID int, [NAME] varchar(32), ZIP varchar(12), NTID varchar(2));

insert into @Test (ID, [NAME], ZIP, NTID)
values
(1, 'Juan', '123', 'H1'),
(1, 'Juan', '123', 'H2'),
(2, 'John', '456', 'H3'),
(2, 'John', '456', 'H4'),
(2, 'John', '456', 'H5');

with cte as (
    select *
      , (row_number() over (partition by ID order by NTID) - 1) / 2 rn
    from @Test
)
select ID, [NAME], string_agg(NTID,',')
from cte
group by ID, [NAME], rn;

db<> 在这里摆弄

注意:如果您将 DDL+DML 作为问题的一部分提供,您会更容易回答。

暂无
暂无

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

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