5

ピボットとアンピボットについて知っています。それは私が望んでいることではありません。集合体データをピボットおよびアンピボットしますが、それは私が望んでいることではありません。

テーブルを行列(線形代数)と考えてください。mxn行列から始める場合、その行列(テーブル)をnxm行列に変換したいと思います。真の転置が欲しい。

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

行数が列数になり、その逆もあることに注意してください。また、どのデータもグループ化または集約していないことに注意してください。ソースに存在するすべての値が結果に存在し、それらのxy座標が交換されています。

4

1 に答える 1

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 FiddlewithDemoを参照してください。これは、必要に応じて動的に実行することもできます。

編集します。列の順序を維持する必要がある場合は、次のようなものを使用できます。これは、テーブルの列の1つに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;

SQL FiddlewithDemoを参照してください

于 2012-10-02T19:13:50.107 に答える