SQL:Real Transpose

mtm*_*ock 5 sql sql-server transpose pivot sql-server-2008

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

将表视为矩阵(线性代数).如果我从mxn矩阵开始,我想将该矩阵(表)转换为nxm矩阵.我想要一个真正的TRANSPOSE.

我怎么能在SQL中这样做?

例如,如果我有:

1  2  3
1  2  4
6  7  8
3  2  1
3  9  1
Run Code Online (Sandbox Code Playgroud)

那么结果应该是:

1  1  6  3  3
2  2  7  2  9
3  4  8  1  1
Run Code Online (Sandbox Code Playgroud)

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

Tar*_*ryn 12

我不确定为什么你认为你不能用a UNPIVOT和a 来完成这个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
Run Code Online (Sandbox Code Playgroud)

请参阅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;
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo