急!!!sql中如何实现把一列拆成两列啊?

时间:2021-12-08 10:34:24
sql中如何实现把一列拆成两列啊?
如下表:

表名:table1
字段:name

name
'张三'
'李四'
'王五'
'刘三'
'杨二'
'胡八'


我想把它拆成交替显示的两列,如下所示:

name1          name2
'张三'         '李四'
'王五'         '刘三'
'杨二'         '胡八'

这个怎么做了,想了半天了,高手帮帮我吧?谢谢了!

8 个解决方案

#1



declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'

create table #t (id int identity(1,1),name nvarchar(4))

insert into #t(name)
select * from @table

select a.name,b.name from #t a left join #t b on a.id=b.id-1 where a.id%2<>0
drop table #t

/*
name name
---- ----
张三   李四
王五   刘三
杨二   胡八

*/

#2


---2000
select id=identity(int),* into #t from table1
select 
  (select name  from #t where id%2=1)a
join
  (select name  from #t where id%2=0)b
on
  a.id=b.id-1

#3


--修改
select id=identity(int),* into #t from table1
select 
  a.name as name1,b.name as name2
from 
  (select name  from #t where id%2=1)a
join
  (select name  from #t where id%2=0)b
on
  a.id=b.id-1

#4


declare @TB table([Pname] varchar(4))
insert @TB
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'

select IDENTITY(int, 1,1) AS rID ,Pname
into #t
from @TB

select t1.pname, t2.pname
from #t t1 left join #t t2 on t1.rid = t2.rid+1
where t1.rid%2 = 0

drop table #t

--测试结果:
/*
pname pname 
----- ----- 
李四    张三
刘三    王五
胡八    杨二

(所影响的行数为 3 行)
*/

#5


考虑一下可能有奇数个的情况

declare @TB table([Pname] varchar(14))
insert @TB
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八' union all
select '胡八1ww'

select IDENTITY(int, 1,1) AS rID ,Pname
into #t
from @TB

if (select count(*) from #t) % 2=0

select t1.pname, t2.pname
from #t t1 full join #t t2 on t1.rid = t2.rid+1
where t1.rid%2 = 0
else
select t1.pname, t2.pname
from #t t1 full join #t t2 on t1.rid + 1 = t2.rid
where t1.rid%2 = 1

drop table #t

--测试结果:
/*
pname          pname          
-------------- -------------- 
张三             李四
王五             刘三
杨二             胡八
胡八1ww          NULL

(所影响的行数为 4 行)

*/

#6


----2005
declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'


select 
  a.name as name1,b.name as name2
from
  (select * from (select id=row_number()over(order by getdate()),* from  @table)t where id%2=1)a,
  (select * from (select id=row_number()over(order by getdate()),* from  @table)t where id%2=0)b
where 
   a.id=b.id-1
/*name1 name2
----- -----
张三    李四
王五    刘三
杨二    胡八

(3 行受影响)
*/

#7


declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'

select 
  max(case (px - 1)%2 when 0 then name else '' end) [1],
  max(case (px - 1)%2 when 1 then name else '' end) [2]
from
(
  select * , px = (select count(1) from @table n where n.name < m.name) + 1 from @table m
) t
group by (px - 1) / 2

/*
1    2    
---- ---- 
胡八   李四
刘三   王五
杨二   张三

(所影响的行数为 3 行)
*/

#8


谢谢大家了,但是我如果想把列拆成4列,我是这样写的,但是会丢掉后面的数据:

declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八' union all
select '胡1' union all
select '胡2' union all
select '胡3'
--我试过了10条数据的话也一样

create table #t (id int identity(1,1),name nvarchar(100))
insert into #t(name)
select name from @table
select * from #t
select a.name,b.name,c.name,d.name from #t a left join 
#t b on a.id=b.id-1 left join 
#t c on b.id=c.id-1 left join 
#t d on c.id=d.id-1
where a.id%4<>0 and b.id%4<>0 and c.id%4<>0
drop table #t

结果:
name    name    name    name
张三 李四 王五 刘三
杨二 胡八 胡1 胡2
这个是我哪里没有写好吗?

#1



declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'

create table #t (id int identity(1,1),name nvarchar(4))

insert into #t(name)
select * from @table

select a.name,b.name from #t a left join #t b on a.id=b.id-1 where a.id%2<>0
drop table #t

/*
name name
---- ----
张三   李四
王五   刘三
杨二   胡八

*/

#2


---2000
select id=identity(int),* into #t from table1
select 
  (select name  from #t where id%2=1)a
join
  (select name  from #t where id%2=0)b
on
  a.id=b.id-1

#3


--修改
select id=identity(int),* into #t from table1
select 
  a.name as name1,b.name as name2
from 
  (select name  from #t where id%2=1)a
join
  (select name  from #t where id%2=0)b
on
  a.id=b.id-1

#4


declare @TB table([Pname] varchar(4))
insert @TB
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'

select IDENTITY(int, 1,1) AS rID ,Pname
into #t
from @TB

select t1.pname, t2.pname
from #t t1 left join #t t2 on t1.rid = t2.rid+1
where t1.rid%2 = 0

drop table #t

--测试结果:
/*
pname pname 
----- ----- 
李四    张三
刘三    王五
胡八    杨二

(所影响的行数为 3 行)
*/

#5


考虑一下可能有奇数个的情况

declare @TB table([Pname] varchar(14))
insert @TB
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八' union all
select '胡八1ww'

select IDENTITY(int, 1,1) AS rID ,Pname
into #t
from @TB

if (select count(*) from #t) % 2=0

select t1.pname, t2.pname
from #t t1 full join #t t2 on t1.rid = t2.rid+1
where t1.rid%2 = 0
else
select t1.pname, t2.pname
from #t t1 full join #t t2 on t1.rid + 1 = t2.rid
where t1.rid%2 = 1

drop table #t

--测试结果:
/*
pname          pname          
-------------- -------------- 
张三             李四
王五             刘三
杨二             胡八
胡八1ww          NULL

(所影响的行数为 4 行)

*/

#6


----2005
declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'


select 
  a.name as name1,b.name as name2
from
  (select * from (select id=row_number()over(order by getdate()),* from  @table)t where id%2=1)a,
  (select * from (select id=row_number()over(order by getdate()),* from  @table)t where id%2=0)b
where 
   a.id=b.id-1
/*name1 name2
----- -----
张三    李四
王五    刘三
杨二    胡八

(3 行受影响)
*/

#7


declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八'

select 
  max(case (px - 1)%2 when 0 then name else '' end) [1],
  max(case (px - 1)%2 when 1 then name else '' end) [2]
from
(
  select * , px = (select count(1) from @table n where n.name < m.name) + 1 from @table m
) t
group by (px - 1) / 2

/*
1    2    
---- ---- 
胡八   李四
刘三   王五
杨二   张三

(所影响的行数为 3 行)
*/

#8


谢谢大家了,但是我如果想把列拆成4列,我是这样写的,但是会丢掉后面的数据:

declare @table table (name nvarchar(4))
insert into @table
select '张三' union all
select '李四' union all
select '王五' union all
select '刘三' union all
select '杨二' union all
select '胡八' union all
select '胡1' union all
select '胡2' union all
select '胡3'
--我试过了10条数据的话也一样

create table #t (id int identity(1,1),name nvarchar(100))
insert into #t(name)
select name from @table
select * from #t
select a.name,b.name,c.name,d.name from #t a left join 
#t b on a.id=b.id-1 left join 
#t c on b.id=c.id-1 left join 
#t d on c.id=d.id-1
where a.id%4<>0 and b.id%4<>0 and c.id%4<>0
drop table #t

结果:
name    name    name    name
张三 李四 王五 刘三
杨二 胡八 胡1 胡2
这个是我哪里没有写好吗?