PIVOT/UNPIVOT 多行多列

Posted

技术标签:

【中文标题】PIVOT/UNPIVOT 多行多列【英文标题】:PIVOT/UNPIVOT multiple rows and columns 【发布时间】:2015-10-13 20:52:10 【问题描述】:

我有一个包含以下(非常简化的)数据的表格:

ID   Value1   Value2   Value3
-----------------------------
1    5        7        Test
2    4        7        Test2

我想获取每一列的名称和该列的行中的值;所以,我想要的输出应该是这样的:

Column        1        2
----------------------------
Value1        5        4
Value2        7        7
Value3        Test     Test2

我一直在玩 PIVOT 和 UNPIVOT,但不太明白。任何帮助将不胜感激。

SQLFiddle here.

【问题讨论】:

你一共有多少个值列? @vkp:假设列出了三个。一旦我有了一个简单的示例,我可以使用动态 sql 将它扩展为任意数量的列。 【参考方案1】:

对我来说,想到的是带有条件聚合的union all

select 'Value1',
       max(case when id = 1 then value1 end) as [1],
       max(case when id = 2 then value1 end) as [2]
from t
union all
select 'Value2',
       max(case when id = 1 then value2 end) as [1],
       max(case when id = 2 then value2 end) as [2]
from t
select 'Value3',
       max(case when id = 1 then value3 end) as [1],
       max(case when id = 2 then value3 end) as [2]
from t;

我认为你可以使用pivot/unpivot 来做到这一点,但我认为这更简单。

【讨论】:

我也是这么想的..但假设id 列可能有很多值,在这种情况下,这会有点麻烦 谢谢!这就是我需要的。

以上是关于PIVOT/UNPIVOT 多行多列的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 中的 PIVOT / UNPIVOT

使用 PIVOT/UNPIVOT 将行转换为列

Oracle pivot & unpivot

PIVOT、UNPIVOT 转换行与列

将矩阵转换为 3 列表('reverse pivot'、'unpivot'、'flatten'、'normalize')

将矩阵转换为 3 列表('reverse pivot'、'unpivot'、'flatten'、'normalize')