【问题标题】:column value based pivot with output in multiple columns基于列值的透视,在多列中输出
【发布时间】:2021-06-27 22:35:24
【问题描述】:

我有一张桌子:

HostName Application
SRV000001 App1
SRV000001 App2
SRV000002 App3
SRV000003 App1
SRV000003 App4
SRV000003 App5

我需要围绕主机名列进行旋转/分组,以便结果类似于。由于要获取的列数不固定,我发现很难在此上使用数据透视函数。

HostName Col1 Col2 Col3
SRV000001 App1 App2
SRV000002 App3
SRV000003 App1 App4 App5

【问题讨论】:

    标签: sql-server tsql pivot


    【解决方案1】:

    可以使用ROW_NUMBER() 窗口函数对列进行编号以确定列标题,例如Col1, Col2..,然后可以通过使用此查询应用条件聚合:

    SELECT [HostName], 
           MAX(CASE WHEN [rn]=1 THEN [Application] END) AS [Col1],
           MAX(CASE WHEN [rn]=2 THEN [Application] END) AS [Col2],
           MAX(CASE WHEN [rn]=3 THEN [Application] END) AS [Col3]
      FROM( 
           SELECT *,
                  ROW_NUMBER() OVER 
                  (PARTITION BY [HostName] ORDER BY [Application]) AS [rn]
             FROM [t]
          ) AS t
     GROUP BY [HostName]
    

    查询可能会通过以下代码块转换为动态查询:

    DECLARE @cols  AS NVARCHAR(MAX),  @query AS NVARCHAR(MAX)
    
    SET @cols = ( SELECT STRING_AGG('MAX(CASE WHEN [rn]='+
                                     CAST([rn] AS VARCHAR)+
                                   ' THEN [Application] END) AS [Col'+
                                     CAST([rn] AS VARCHAR)+
                                   ']',',') 
                    FROM (SELECT DISTINCT ROW_NUMBER() OVER 
                                (PARTITION BY [HostName] ORDER BY [HostName]) AS [rn]
                            FROM [t] ) t );
    
    SET  @query = 
         N'SELECT [HostName],' + @cols + 
         N'  FROM( 
                  SELECT *,
                         ROW_NUMBER() OVER 
                         (PARTITION BY [HostName] ORDER BY [Application]) AS [rn]
                    FROM [t]
                 ) AS t
            GROUP BY [HostName]';
    
    EXEC sp_executesql @query;
    

    Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-04
      • 1970-01-01
      • 2017-10-19
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      相关资源
      最近更新 更多