基于此示例表
ID | 姓名 | 压缩 | NTID |
---|---|---|---|
1 | 胡安 | 123 | H1 |
1 | 胡安 | 123 | H2 |
2 | 约翰 | 456 | H3 |
2 | 约翰 | 456 | H4 |
2 | 约翰 | 456 | H5 |
我想显示ntid
为逗号分隔值但最多 2 个项目的组
预期结果
ID | 姓名 | 压缩 | NTID |
---|---|---|---|
1 | 胡安 | 123 | H1、H2 |
2 | 约翰 | 456 | H3、H4 |
2 | 约翰 | 456 | H5 |
使用 SQL Server,有没有办法实现这一点?
通过使用该STRING_AGG
函数,它将所有内容连接在一行中,但我需要将其分组为最多 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 作为问题的一部分提供,那么回答起来就会容易得多。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句