Matrimony Ответов: 1

Матричное преобразование в SQL server 2014


у меня есть такая таблица: 3 столбца * 4 строки

col1 col2 col3
a b c
Д Е Ф
g h i
i j k

я хочу перенести его с помощью sql в таблицу 4 столбца * 3 строки.
на col1 и col2 с col3 col4
А Д Г и
б е н J
c f i k

есть ли элегантный способ сделать это ?

большое спасибо~!!!

Что я уже пробовал:

я попробовал повернуть и открутить, но это не помогло.

1 Ответов

Рейтинг:
9

Mehedi Shams

Привет Супружество,

Вы можете использовать pivot, и unpivot для этой проблемы. Вы можете использовать следующий запрос:

select * from (
  select *, ROW_NUMBER() over (partition by name order by name) as rownum from [dbo].[TableName]
  unpivot(value for name in (col1, col2, col3))temp1)temp2
  pivot (max(value) for rownum in ([1], [2], [3], [4]))temp3
Позвольте мне немного объяснить.

Сначала вы не обращаете внимания-это означает, что вы переносите столбцы в строки. Таким образом, на данный момент ваша таблица выглядит следующим образом:
value	name	rownum
a	    col1	  1
d	    col1	  2
g	    col1	  3
j	    col1	  4
k	    col2	  1
h	    col2	  2
e	    col2	  3
b	    col2	  4
c	    col3	  1
f	    col3	  2
i	    col3	  3
l	    col3	  4
Зачем нам нужна дополнительная колонка rownum? Это потому, что мы будем использовать pivot (чтобы преобразовать строки в столбцы) в нашей следующей строке и pivot требуется применить агрегатную функцию к столбцу. Следующая строка транспонирует столбцы (названные здесь "значениями") в виде строк, поворачиваясь на rownum переменная.
pivot (max(value) for rownum in ([1], [2], [3], [4]))q
Теперь ваш конечный результат выглядит следующим образом:
name	1	2	3	4
col1	a	d	g	j
col2	k	h	e	b
col3	c	f	i	l
Надеюсь, это поможет?