Transpose rows and columns with no aggregate

前端 未结 2 1430
你的背包
你的背包 2020-11-28 16:00

I have the following dataset

Account Contact

1   324324324
1   674323234
2   833343432
2   433243443
3   787655455
4   754327545
4   455435435
5   543544355         


        
2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-28 16:28

    Just a slightly different way to generate the dynamic PIVOT:

    DECLARE @c INT;
    
    SELECT TOP 1 @c = COUNT(*) 
      FROM dbo.YourTable
      GROUP BY Account 
      ORDER BY COUNT(*) DESC;
    
    DECLARE @dc1 NVARCHAR(MAX) = N'', @dc2 NVARCHAR(MAX) = N'', @sql NVARCHAR(MAX);
    
    SELECT @dc1 += ',Contact' + RTRIM(i), @dc2 += ',[Contact' + RTRIM(i) + ']'
      FROM (SELECT TOP (@c) i = number + 1 
      FROM master.dbo.spt_values WHERE type = N'P' ORDER BY number) AS x;
    
    SET @sql = N'SELECT Account ' + @dc1 + 
      ' FROM (SELECT Account, Contact, rn = ''Contact'' 
          + RTRIM(ROW_NUMBER() OVER (PARTITION BY Account ORDER BY Contact))
        FROM dbo.YourTable) AS src PIVOT (MAX(Contact) FOR rn IN (' 
          + STUFF(@dc2, 1, 1, '') + ')) AS p;';
    
    EXEC sp_executesql @sql;
    

    SQLiddle demo

提交回复
热议问题