SQL:Real Transpose

时间:2012-10-02 18:39:17

标签: sql sql-server sql-server-2008 pivot transpose

我知道pivot和unpivot。那不是我想要的。透视和取消汇总数据,但这不是我想要的。

将表视为矩阵(线性代数)。如果我从m×n矩阵开始,我想将该矩阵(表)转换为n×m矩阵。我想要一个真实的TRANSPOSE

如何在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坐标已被交换。

1 个答案:

答案 0 :(得分:12)

我不确定为什么您认为自己无法通过UNPIVOTPIVOT完成此操作:

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

SQL Fiddle with Demo。如果需要,这也可以动态执行。

编辑,如果需要保留列顺序,那么您可以使用类似这样的内容,这会在row_number()中应用order by,而不会在表格的其中一列上使用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; (此处为article about using non-deterministic row numbers):

{{1}}

请参阅SQL Fiddle with Demo