我有一个包含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 ..行),而不是唯一的行.
如果您提前知道列的列表,那么它应该像将两列的每个组合并在一起一样简单:
;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
| 归档时间: |
|
| 查看次数: |
580 次 |
| 最近记录: |