Если вы знаете, список столбцов раньше время, она должна быть столь же просто, как unioning каждой группы из двух колонн вместе:
;with Data as (
select 'A' as A, 'B' as B, 'C' as C, 'D' as D, 'E' as E, 'F' as F
)
select A,B from Data union
select C,D from Data union
select E,F from Data
Если список столбцов является динамическим, вы будете нуждаться в динамическом SQL для обработать. Вот полностью рабочий пример с использованием тестовой таблицы с 11 столбцами:
create table Test (id01 int,id02 int,id03 int,id04 int,id05 int,id06 int,id07 int,id08 int,id09 int,id10 int,id11 int);
insert Test values (1,2,3,4,5,6,7,8,9,10,11);
declare @select varchar(max)
;with ColumnInfo as (
select
row_number() over (order by column_name) - 1 as rownumber,
column_name
from information_schema.columns
where table_name = 'Test'
)
select
@select = coalesce(@select + ' union ' + char(13) + char(10), '') +
'select ' + max(case when rownumber % 2 = 0 then column_name end) +
',' + coalesce(max(case when rownumber % 2 = 1 then column_name end), 'NULL') +
' from test'
from
ColumnInfo
group by
rownumber/2
exec(@select)
Пример ввода:
id01 id02 id03 id04 id05 id06 id07 id08 id09 id10 id11
1 2 3 4 5 6 7 8 9 10 11
Пример вывода:
id01 id02
1 2
3 4
5 6
7 8
9 10
11 NULL
Живая демонстрация: http://sqlfiddle.com/#!3/d0507/1
Хотите ли вы решение как для Oracle и Sql Server? –
Вам нужно иметь SQL-решение? – mellamokb
Адриан, это не имеет значения, мне просто нужно одно решение. – Lukas