SQL转置和连接

时间:2019-12-05 03:27:31

标签: sql sql-server pivot

我有一个表,其数据如下:

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

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解决方案