【问题标题】:SQL Transpose Columns into RowsSQL 将列转置为行
【发布时间】:2018-08-28 17:27:50
【问题描述】:

我一直在尝试转置这个;

**ProjectNum    PillarID    BusinessPillar**
95329           29          Pillar29
95329           1           Pillar1
95354           1           Pillar1
95354           4           Pillar4
95354           7           Pillar7

进入这个;

**ProjectNum    Pillars**
95329           Pillar1, Pillar29
95354           Pillar1, Pillar4, Pillar7

我已经研究过使用 pivot/unpivot 并且已经走到了这一步

DECLARE @cols AS NVARCHAR(MAX),
    @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(PillarID) 
                from dbo.MyTable
                group by BusinessPillar, PillarID
                order by PillarID
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')
set @query = N'SELECT ProjectNum, ' + @cols + N' from 
         (
            select ProjectNum, PillarID, BusinessPillar
            from dbo.MyTable
        ) x
        pivot 
        (
            max(BusinessPillar)
            for PillarID in (' + @cols + N')
        ) p '
exec sp_executesql @query;

但是,我在弄清楚如何将所有转置结果组合成一个逗号分隔的列时遇到了很多麻烦,就像我想要的示例一样。

感谢任何帮助或指导。

【问题讨论】:

  • 请添加DB名称作为标签。

标签: sql sql-server tsql pivot unpivot


【解决方案1】:

您可以使用以下查询来获得您想要的结果:

SELECT ProjectNum, STUFF(
     (SELECT DISTINCT ', ' + BusinessPillar
      FROM Test
      WHERE ProjectNum = t.ProjectNum
      FOR XML PATH (''))
      , 1, 1, '')  AS Pillars
      FROM Test as t
      GROUP BY ProjectNum

这是 SQL Fiddle 链接: SQL Fiddle

【讨论】:

    【解决方案2】:

    尝试使用 LISTAGG:

    SELECT ProjectNum, LISTAGG(BusinessPillar, ', ') WITHIN GROUP (ORDER BY BusinessPillar) AS PILLARS
          FROM Test
          GROUP BY ProjectNum
    

    More info on LISTAGG

    【讨论】:

      猜你喜欢
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 2013-12-05
      • 1970-01-01
      相关资源
      最近更新 更多