SQL:实转置

SQL:实转置,sql,sql-server,sql-server-2008,pivot,transpose,Sql,Sql Server,Sql Server 2008,Pivot,Transpose,我知道pivot和unpivot。那不是我想要的。Pivot和unpivot聚合数据,但这不是我想要的 把一张表想象成一个矩阵(线性代数)。如果我从一个m x n矩阵开始,我想把这个矩阵(表)转换成一个n x m矩阵。我想要一个真实的世界 如何在SQL中实现这一点 例如,如果我有: 1 2 3 1 2 4 6 7 8 3 2 1 3 9 1 那么结果应该是: 1 1 6 3 3 2 2 7 2 9 3 4 8 1 1 请注意,行数变为列数,反之亦然

我知道pivot和unpivot。那不是我想要的。Pivot和unpivot聚合数据,但这不是我想要的

把一张表想象成一个矩阵(线性代数)。如果我从一个m x n矩阵开始,我想把这个矩阵(表)转换成一个n x m矩阵。我想要一个真实的世界

如何在SQL中实现这一点

例如,如果我有:

1  2  3
1  2  4
6  7  8
3  2  1
3  9  1
那么结果应该是:

1  1  6  3  3
2  2  7  2  9
3  4  8  1  1

请注意,行数变为列数,反之亦然。还请注意,我没有对任何数据进行分组或聚合。源中存在的每一个值都存在于结果中,并且它们的x-y坐标都已交换。

我不确定您为什么认为使用
UNPIVOT
PIVOT
无法实现这一点:

select [1], [2], [3], [4], [5]
from 
(
  select *
  from
  (
    select col1, col2, col3,
      row_number() over(order by col1) rn
    from yourtable
  ) x
  unpivot
  (
    val for col in (col1, col2, col3)
  ) u
) x1
pivot
(
  max(val)
  for rn in ([1], [2], [3], [4], [5])
) p
看。如果需要,这也可以动态执行

编辑,如果需要保留列顺序,则可以使用类似的方法,在表中的一列上应用
行编号()
,而不使用
排序依据(
)(以下是一个示例):


请参见

能否发布一些示例数据和预期结果?我使用的是MS SQL Server 2008。更多详细信息已发布。@mtmurdock您认为
PIVOT
不起作用有什么原因吗?我不知道为什么这不是一个问题。对我来说,这似乎很直截了当。如何将数据转换为SQL?甚至有一个答案,有多个赞成票,它解决了我的问题。可能重复的哇这是真的很接近。做得好。唯一的问题是,在over子句中使用
orderbycol1
时,您对列进行了重新排序。有没有办法保持顺序?@mtmurdock您是否碰巧在表上有一个
id
字段,用于按该顺序放置行?像是约会什么的?好吧,看起来很棒!我不知道它在干什么,但干得不错。我从来没有想过要把一个无支点和一个支点结合起来。我在调整它时遇到了一些困难,但这应该让我朝着正确的方向走。我正在查看您关于保留列顺序的编辑,但我不明白这是在做什么。它似乎对我不起作用。@mtmurdock在
over()
中需要一个
ORDER BY
,但您不想按任何列排序,因此您需要提供它-
选择1
或甚至
选择0
。如果您在解决问题时遇到问题,请首先从内部查询开始,查看
行编号()
,然后开始解决问题
select [1], [2], [3], [4], [5]
from 
(
  select *
  from
  (
    select col1, col2, col3,
      row_number() 
        over(order by (select 1)) rn
    from yourtable
  ) x
  unpivot
  (
    val for col in (col1, col2, col3)
  ) u
) x1
pivot
(
  max(val)
  for rn in ([1], [2], [3], [4], [5])
) p;