[英]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.