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
Надеюсь, это поможет?