[英]Create a new column name in SQL based on results
您可以使用包含XML PATH
子句的SELECT
語句以獲得動態 pivot。讓我們首先創建一個臨時表( #tab
),以便通過使用ROW_NUMBER()
函數對具有更改值的列( Name
和Value
)進行編號(確實如此,您可以直接使用Value
列而不是生成序列號,但我故意留下 function 以獲得通用解決方案)。
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.