如何在sql中转置表
数据库是SQL Server,我有以下表格:如何在sql中转置表,sql,sql-server,transpose,Sql,Sql Server,Transpose,数据库是SQL Server,我有以下表格: NODE | Param1 | Param2 | Param3 | Param4 | Param5 | ----------------------------------------------------------------------- node1| some value | some value | some value | some value | some value | node2| some
NODE | Param1 | Param2 | Param3 | Param4 | Param5 |
-----------------------------------------------------------------------
node1| some value | some value | some value | some value | some value |
node2| some value | some value | some value | some value | some value |
node3| some value | some value | some value | some value | some value |
node4| some value | some value | some value | some value | some value |
我试着把它转换成这样:
PARAM | node1 | node2 | node3 | node4 |
-----------------------------------------------------------
Param1| some value | some value | some value | some value |
Param2| some value | some value | some value | some value |
Param3| some value | some value | some value | some value |
Param4| some value | some value | some value | some value |
Param5| some value | some value | some value | some value |
我试图使用PIVOT
,但无法正确使用
如果我使用这个:
SELECT
*
FROM
(SELECT
NODE ,
Param1
FROM
My_Table
) TEMP
PIVOT
(
MAX(Param1) FOR NODE IN (node1, node2, node3, node4)
) PIV
然后它只转置一行您真的应该尝试修复您的表结构。无论如何,这里有一种使用条件聚合的方法
为什么要从一种糟糕的格式转到另一种糟糕的格式?取消将表拆分为一个表,每个
param
和node
?好的,可能正确的方法是先取消拆分表,然后使用pivot
WITH CteUnpivot(node, val, param) AS(
SELECT node, Param1, 'Param1' FROM tbl UNION ALL
SELECT node, Param2, 'Param2' FROM tbl UNION ALL
SELECT node, Param3, 'Param3' FROM tbl UNION ALL
SELECT node, Param4, 'Param4' FROM tbl UNION ALL
SELECT node, Param5, 'Param5' FROM tbl
)
SELECT
param,
node1 = MAX(CASE WHEN node = 'node1' THEN val END),
node2 = MAX(CASE WHEN node = 'node2' THEN val END),
node3 = MAX(CASE WHEN node = 'node3' THEN val END),
node4 = MAX(CASE WHEN node = 'node4' THEN val END),
node5 = MAX(CASE WHEN node = 'node5' THEN val END)
FROM CteUnpivot
GROUP BY param