我有一个表,其数据如下:
a 1
a 2
a 3
a 4
b 1
b 2
b 3
CREATE TABLE piv1([name] varchar(5), [no] int);
INSERT INTO piv1
([name], [no])
VALUES
('a', 1),
('a', 2),
('a', 3),
('a', 4),
('b', 1),
('b', 2),
('b', 3);
SELECT *
FROM piv1
PIVOT (
MAX(no)
FOR no
IN ([1],[2],[3],[4])
)p
但是我得到的输出如下:
1 2 3 4 name
1 2 3 4 a
1 2 3 null b
我想要的输出:
a 1,2,3,4
b 1,2,3
答案 0 :(得分:4)
您似乎想要string_agg()
:
select name, string_agg(no, ',') within group (order by no)
from piv1
group by name;
答案 1 :(得分:3)
您可以使用concat_ws()
。假设您仍然需要旋转。
SELECT name, concat_ws(',', [1],[2],[3],[4]) FROM @piv1
PIVOT (max(no) for no IN ([1],[2],[3],[4]) )p
请参见dbfiddle。
如果您未使用 sql server 2017 ,则可以选择使用stuff()
函数。
select
t1.[name],
ColB = stuff((select ( ', ' + cast([no] as varchar(30)) )
from piv1 t2
where t1.[name] = t2.[name]
order by [name]
for xml path( '' )
), 1, 1, '' )from piv1 t1
group by [name]
答案 2 :(得分:1)
如果在SQL SERVER 2017之前具有SQL Server,则可以使用FOR XML PATH进行串联,如下所示:
SELECT name,STUFF((SELECT ','+ cast([no] as VARCHAR(20)) from #piv1 where name = op.name FOR XML PATH('')),1,1,'') as nocat
FROM piv1 as op
GROUP BY name
对于SQL SERVER 2017中的版本,可以参考@Gordon Linoff解决方案