怎么把
a b
a 1
a 2
a 3
b 1
b 2
b 3
变为这样
a 1 2 3
a 1 2 3
b 1 2 3

解决方案 »

  1.   

    /*
    普通行列转换
    (爱新觉罗.毓华 2007-11-18于海南三亚)假设有张学生成绩表(tb)如下:
    Name Subject Result
    张三 语文  74
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94
    */-------------------------------------------------------------------------
    /*
    想变成 
    姓名         语文        数学        物理          
    ---------- ----------- ----------- ----------- 
    李四         74          84          94
    张三         74          83          93
    */create table tb
    (
       Name    varchar(10) ,
       Subject varchar(10) ,
       Result  int
    )insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
    insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
    insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
    insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
    insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
    insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
    go--静态SQL,指subject只有语文、数学、物理这三门课程。
    select name 姓名,
      max(case subject when '语文' then result else 0 end) 语文,
      max(case subject when '数学' then result else 0 end) 数学,
      max(case subject when '物理' then result else 0 end) 物理
    from tb
    group by name
    /*
    姓名         语文        数学        物理          
    ---------- ----------- ----------- ----------- 
    李四         74          84          94
    张三         74          83          93
    */--动态SQL,指subject不止语文、数学、物理这三门课程。
    declare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql = @sql + ' from tb group by name'
    exec(@sql) 
    /*
    姓名         数学        物理        语文          
    ---------- ----------- ----------- ----------- 
    李四         84          94          74
    张三         83          93          74
    */-------------------------------------------------------------------
    /*加个平均分,总分
    姓名         语文        数学        物理        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         74          84          94          84.00                252
    张三         74          83          93          83.33                250
    */--静态SQL,指subject只有语文、数学、物理这三门课程。
    select name 姓名,
      max(case subject when '语文' then result else 0 end) 语文,
      max(case subject when '数学' then result else 0 end) 数学,
      max(case subject when '物理' then result else 0 end) 物理,
      cast(avg(result*1.0) as decimal(18,2)) 平均分,
      sum(result) 总分
    from tb
    group by name
    /*
    姓名         语文        数学        物理        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         74          84          94          84.00                252
    张三         74          83          93          83.33                250
    */--动态SQL,指subject不止语文、数学、物理这三门课程。
    declare @sql1 varchar(8000)
    set @sql1 = 'select Name as ' + '姓名'
    select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
    exec(@sql1) 
    /*
    姓名         数学        物理        语文        平均分                总分          
    ---------- ----------- ----------- ----------- -------------------- ----------- 
    李四         84          94          74          84.00                252
    张三         83          93          74          83.33                250
    */drop table tb ---------------------------------------------------------
    ---------------------------------------------------------
    /*
    如果上述两表互相换一下:即姓名 语文 数学 物理
    张三 74  83  93
    李四 74  84  94想变成 
    Name       Subject Result      
    ---------- ------- ----------- 
    李四         语文      74
    李四         数学      84
    李四         物理      94
    张三         语文      74
    张三         数学      83
    张三         物理      93
    */create table tb1
    (
       姓名 varchar(10) ,
       语文 int ,
       数学 int ,
       物理 int
    )insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
    insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select * from
    (
      select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
      union all
      select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
      union all
      select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
    ) t
    order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end--------------------------------------------------------------------
    /*加个平均分,总分
    Name       Subject     Result               
    ---------- -------    -------------------- 
    李四         语文      74.00
    李四         数学      84.00
    李四         物理      94.00
    李四         平均分    84.00
    李四         总分      252.00
    张三         语文      74.00
    张三         数学      83.00
    张三         物理      93.00
    张三         平均分    83.33
    张三         总分      250.00
    */select * from
    (
      select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1 
      union all
      select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
      union all
      select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
      union all
      select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
      union all
      select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
    ) t
    order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 enddrop table tb1
      

  2.   

    declare @tb table (col1 varchar(10),col2 varchar(10))
    insert into @tb select 'a',1
    insert into @tb select 'a',2
    insert into @tb select 'a',3
    insert into @tb select 'b',1
    insert into @tb select 'b',2
    insert into @tb select 'b',3select col1,
    max(case when col2 ='1' then col2 end) as '1',
    max(case when col2 ='2' then col2 end) as '2',
    max(case when col2 ='3' then col2 end) as '3'
    from @tb group by col1
      

  3.   

    --你的结果是否多了一行?
    create table tb(a varchar(10),b int)
    insert into tb values('a', 1) 
    insert into tb values('a', 2) 
    insert into tb values('a', 3) 
    insert into tb values('b', 1) 
    insert into tb values('b', 2) 
    insert into tb values('b', 3) 
    goselect a,
      max(case b when 1 then b else 0 end) b1,
      max(case b when 2 then b else 0 end) b2,
      max(case b when 3 then b else 0 end) b3
    from tb
    group by adrop table tb/*
    a          b1          b2          b3          
    ---------- ----------- ----------- ----------- 
    a          1           2           3
    b          1           2           3(所影响的行数为 2 行)
    */
      

  4.   

    col1 1 2 3
    a 1 2 3
    b 1 2 3别抢我的小梁,这是我哥们给我的奖励
      

  5.   

    create table tb(a varchar(10),b int)
    insert into tb values('a', 1) 
    insert into tb values('a', 2) 
    insert into tb values('a', 3) 
    insert into tb values('b', 1) 
    insert into tb values('b', 2) 
    insert into tb values('b', 3) 
    go--静态SQL,指B的值固定为1,2,3
    select a,
      max(case b when 1 then b else 0 end) b1,
      max(case b when 2 then b else 0 end) b2,
      max(case b when 3 then b else 0 end) b3
    from tb
    group by a
    /*
    a          b1          b2          b3          
    ---------- ----------- ----------- ----------- 
    a          1           2           3
    b          1           2           3
    (所影响的行数为 2 行)
    */--动态SQL,指B的值不固定
    declare @sql varchar(8000)
    set @sql = 'select a'
    select @sql = @sql + ' , max(case b when ''' + cast(b as varchar) + ''' then b else 0 end) [b' + cast(b as varchar) + ']'
    from (select distinct b from tb) as a
    set @sql = @sql + ' from tb group by a'
    exec(@sql) 
    /*
    a          b1          b2          b3          
    ---------- ----------- ----------- ----------- 
    a          1           2           3
    b          1           2           3
    (所影响的行数为 2 行)
    */drop table tb