我知道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坐标已被交换。
答案 0 :(得分:12)
我不确定为什么您认为自己无法通过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
见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}}