SQL - 对列和行值进行透视
SQL - Pivoting on Column and Row Values
我正在尝试在 X 和 Y 位置旋转 Table。 table 的格式类似于以下内容。
每一行都有一个相对于其行和列位置的值。'AThing' 和 'FileName' 在数据集中将被忽略。
因此,如果这是旋转的,我们将得到:
我已经尝试了一段时间,但似乎无法弄清楚,有什么想法吗?
编辑:每个 'FileName' 的字段数是动态的。我设法使用以下方法提取了列名而不是数据:
-- Construct List of Columns to Pivot
SELECT @PivotCols =
STUFF(
(SELECT ',' + QUOTENAME(FieldName)
FROM #Data
GROUP BY ColPos, FieldName
ORDER BY ColPos ASC
FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @PivotQuery =
SELECT ' + @PivotCols + N'
FROM
(
SELECT ColPos, FieldName
FROM #Data
GROUP BY ColPos, FieldName
) x
PIVOT
(
MIN(ColPos)
FOR FieldName IN (' + @PivotCols + N')
) p'
EXEC sp_executesql @PivotQuery
请试试这个代码:
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(FieldName)
FROM (SELECT distinct p.FieldName FROM Tablename AS p
) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT p.Value, p.FieldName, p.RowPos
FROM Tablename AS p
) AS j
PIVOT
(
MAX(Value) FOR FieldName IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;
我正在尝试在 X 和 Y 位置旋转 Table。 table 的格式类似于以下内容。
每一行都有一个相对于其行和列位置的值。'AThing' 和 'FileName' 在数据集中将被忽略。
因此,如果这是旋转的,我们将得到:
我已经尝试了一段时间,但似乎无法弄清楚,有什么想法吗?
编辑:每个 'FileName' 的字段数是动态的。我设法使用以下方法提取了列名而不是数据:
-- Construct List of Columns to Pivot
SELECT @PivotCols =
STUFF(
(SELECT ',' + QUOTENAME(FieldName)
FROM #Data
GROUP BY ColPos, FieldName
ORDER BY ColPos ASC
FOR XML PATH(''),TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @PivotQuery =
SELECT ' + @PivotCols + N'
FROM
(
SELECT ColPos, FieldName
FROM #Data
GROUP BY ColPos, FieldName
) x
PIVOT
(
MIN(ColPos)
FOR FieldName IN (' + @PivotCols + N')
) p'
EXEC sp_executesql @PivotQuery
请试试这个代码:
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N', p.' + QUOTENAME(FieldName)
FROM (SELECT distinct p.FieldName FROM Tablename AS p
) AS x;
SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
SELECT p.Value, p.FieldName, p.RowPos
FROM Tablename AS p
) AS j
PIVOT
(
MAX(Value) FOR FieldName IN ('
+ STUFF(REPLACE(@columns, ', p.[', ',['), 1, 1, '')
+ ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;