您可以使用包含XML PATH 子句的SELECT 语句来获得动态枢轴。让我们首先创建一个临时表(#tab),以便通过使用ROW_NUMBER()函数对具有更改值的列(Name和Value)进行编号(实际上,您可以直接使用Value列而不是生成序号,但我故意离开该函数以获得通用解决方案)。
WITH t AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY [Account] ORDER BY [Value]) AS rn
FROM [tab]
)
SELECT *, CONCAT('Value',rn) AS rn_v, CONCAT('Name',rn) AS rn_n
INTO #tab
FROM t
然后在下面的代码中使用它来得到想要的结果集
DECLARE @colsv1 AS NVARCHAR(MAX), @colsv2 AS NVARCHAR(MAX),
@colsn1 AS NVARCHAR(MAX), @colsn2 AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
SELECT @colsv1 =
STUFF((SELECT DISTINCT ',' + QUOTENAME(CONCAT('Value',[rn]))
FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
SELECT @colsv2 =
STUFF((SELECT DISTINCT ',' + 'MAX('+QUOTENAME(CONCAT('Value',[rn]))+') AS '
+ QUOTENAME(CONCAT('Value',[rn]))
FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
SELECT @colsn1 =
STUFF(
(SELECT DISTINCT ',' + QUOTENAME(CONCAT('Name',[rn]))
FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
SELECT @colsn2 =
STUFF((SELECT DISTINCT ',' + 'MAX('+QUOTENAME(CONCAT('Name',[rn]))+') AS '
+ QUOTENAME(CONCAT('Name',[rn]))
FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
SET @query =
N'SELECT [Account],'+ @colsv2 +','+ @colsn2 + ',[UserCreatedBy],[Date]'+
N' FROM #tab
PIVOT
(
MAX([Value]) FOR [rn_v] IN ('+ @colsv1 + N')
) AS p1
PIVOT
(
MAX([Name]) FOR [rn_n] IN ('+ @colsn1 + N')
) AS p2
GROUP BY [Account],[UserCreatedBy],[Date] ';
EXEC sp_executesql @query;
Demo