【问题标题】: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