我表中的数据是这样的
李      21      
李      33     
李      23      
李      27      
张      11      
张      45      
张      67      
张      65      
我想转换成这样的李     张
21     11
33     45
23     67
27     65
这只是个例 子数据基本是每天都在动的。请教了

解决方案 »

  1.   

    select m.c2 , n.c2 from
    (select c2 '李' , px = row_number() over(order by c2) from tb where c1 = '李') m
    full join
    (select c2 '张' , px = row_number() over(order by c2) from tb where c1 = '张') n
    on m.px = n.px
      

  2.   

    create table tb(c1 nvarchar(10),c2 int)
    insert into tb values(N'李', 21   )
    insert into tb values(N'李', 33   )
    insert into tb values(N'李', 23   )
    insert into tb values(N'李', 27   )
    insert into tb values(N'张', 11   )
    insert into tb values(N'张', 45   )
    insert into tb values(N'张', 67   )
    insert into tb values(N'张', 65   )
    goselect m.[李] , n.[张] from
    (select c2 '李' , px = row_number() over(order by c2) from tb where c1 = N'李') m
    full join
    (select c2 '张' , px = row_number() over(order by c2) from tb where c1 = N'张') n
    on m.px = n.px
    order by m.pxdrop table tb /*
    李           张
    ----------- -----------
    21          11
    23          45
    27          65
    33          67(4 行受影响)
    */
      

  3.   

    数据是动态的,没关系,我用的是full join,不过只能是李,张两姓才行.
      

  4.   

    数据很多的。前面的name也是很多的且也是不固定的。问题的关键就是在这里
      

  5.   

    create table #(c1 nvarchar(10),c2 int)insert into # values(N'李', 21   )
    insert into # values(N'李', 33   )
    insert into # values(N'李', 23   )
    insert into # values(N'李', 27   )
    insert into # values(N'张', 11   )
    insert into # values(N'张', 45   )
    insert into # values(N'张', 67   )
    insert into # values(N'张', 65   )GO
    ;with cc as
    (select *,id=(select count(1)+1 from # a where a.c1=#.c1 and a.c2<#.c2) from #)select  top 1 c1 name1,name2=(select top 1 c1 from cc a where a.c1<>cc.c1 order by a.c1 asc) from cc 
    union all
    select top 4 ltrim(c2),hh=(select top 1 ltrim(c2) from cc a where  a.id=cc.id  and a.c1<>cc.c1 order by a.id asc) from cc 
    --这里4表示有四个数据,应该取最大
      

  6.   

    name1        name2
    ------------ ------------
    李            张
    21           11
    33           67
    23           45
    27           65(5 行受影响)
      

  7.   

    --呵呵,没排序,调整一下
    ;with cc as
    (select *,id=(select count(1)+1 from # a where a.c1=#.c1 and a.c2<#.c2) from # )select name1,name2 from 
    (
    select  top 1 c1 name1,name2=(select top 1 c1 from cc a where a.c1<>cc.c1 order by a.c1 asc),level=0 from cc 
    union all
    select top 4 ltrim(c2),hh=(select top 1 ltrim(c2) from cc a where  a.id=cc.id  and a.c1<>cc.c1 order by a.id asc),level=cc.id from cc 
    order by level asc
    ) t
    GO
    name1        name2
    ------------ ------------
    李            张
    21           11
    11           21
    45           23
    23           45(5 行受影响)
      

  8.   

    create table tb(c1 nvarchar(10),c2 int)
    insert into tb values(N'李', 21   )
    insert into tb values(N'李', 33   )
    insert into tb values(N'李', 23   )
    insert into tb values(N'李', 27   )
    insert into tb values(N'张', 11   )
    insert into tb values(N'张', 45   )
    insert into tb values(N'张', 67   )
    insert into tb values(N'张', 65   )godeclare @sql nvarchar(4000)
    set @sql = ''
    select @sql = @sql + ',max(case c1 when N''' + c1 + ''' then c2 else 0 end) [' + c1 + ']'
    from (select distinct c1 from tb m) as a
    set @sql = 'select ' + substring(@sql,2,len(@sql)) + ' from (select t.* ,px =row_number() over(partition by c1 order by c2) from tb t) m group by px'
    exec(@sql) drop table tb/*
    张           李
    ----------- -----------
    11          21
    45          23
    65          27
    67          33(4 行受影响)
    */create table tb(c1 nvarchar(10),c2 int)
    insert into tb values(N'李', 21   )
    insert into tb values(N'李', 33   )
    insert into tb values(N'李', 23   )
    insert into tb values(N'李', 27   )
    insert into tb values(N'张', 11   )
    insert into tb values(N'张', 45   )
    insert into tb values(N'张', 67   )
    insert into tb values(N'张', 65   )
    insert into tb values(N'王', 11   )
    insert into tb values(N'王', 45   )
    insert into tb values(N'王', 67   )
    insert into tb values(N'王', 65   )godeclare @sql nvarchar(4000)
    set @sql = ''
    select @sql = @sql + ',max(case c1 when N''' + c1 + ''' then c2 else 0 end) [' + c1 + ']'
    from (select distinct c1 from tb m) as a
    set @sql = 'select ' + substring(@sql,2,len(@sql)) + ' from (select t.* ,px =row_number() over(partition by c1 order by c2) from tb t) m group by px'
    exec(@sql) drop table tb/*
    张           李           王
    ----------- ----------- -----------
    11          21          11
    45          23          45
    65          27          65
    67          33          67(4 行受影响)
    */
      

  9.   


    误会了!
    我以后你的姓名还要一行,是这样效果
    name1        name2
    ------------ ------------
    李            张
    21           11
    33           67
    23           45
    27           65(5 行受影响)
    其实你只须把姓名当成列名。
    而你要这种 效果!
    张           李
    ----------- -----------
    11          21
    45          23
    65          27
    67          33
      

  10.   

    这个行变列,可以用case...when...then...end case
      

  11.   

    使用简单Case函数和Case搜索函数