SQL行为2列

Luk*_*kas 0 sql sql-server

我有一个包含A,B,C,D,E,F列的数据行...我怎么能写一个sql select来得到结果:

Col1, Col2
A,    B
C,    D
E,    F
...
Run Code Online (Sandbox Code Playgroud)

编辑:只有一行和动态列数.我不允许使用information_schema和sys表.同样有趣的是知道如何为整个表(多个A,B,C,D,E ..行),而不是唯一的行.

mel*_*okb 5

如果您提前知道列的列表,那么它应该像将两列的每个组合并在一起一样简单:

;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
Run Code Online (Sandbox Code Playgroud)

如果列列表是动态的,则需要动态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)
Run Code Online (Sandbox Code Playgroud)

样本输入:

id01 id02 id03 id04 id05 id06 id07 id08 id09 id10 id11
1    2    3    4    5    6    7    8    9    10    11
Run Code Online (Sandbox Code Playgroud)

样本输出:

id01 id02
1    2
3    4
5    6
7    8
9    10
11   NULL
Run Code Online (Sandbox Code Playgroud)

现场演示:http://sqlfiddle.com/#!3/d0507/1