有如下一张表(TableA)
日期                姓名             A任务(得分)       B任务(得分)        C任务(得分)
2008-03-01       张三              80               90                 100
2008-03-01       李四              10               20                 30
2008-03-01       王五              60               60                 60
2008-03-02       张三              90               90                 90
2008-03-02       李四              20               20                 20想得到如下查询结果
日期          张三A    张三B    张三C      李四A     李四B     李四C      王五A       王五B     王五C
2008-03-01   80       90      100       10        20        30        60          60       60
2008-03-04   90       90      90        20        20        20 
...请高手帮忙,谢谢    

解决方案 »

  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
    --> 2005 静态
    select * from (select * from #T) a pivot (max(分数) for 课程 in (语文,数学,英语)) b--> 2005 动态
    declare @2005 nvarchar(4000)
    select @2005=isnull(@2005+',','')+课程 from #T group by 课程
    exec ('select * from (select * from #T) a pivot (max(分数) for 课程 in ('+@2005+')) b')
      

  2.   

    日期写错了,不好意思有如下一张表(TableA) 
    日期                姓名             A任务(得分)       B任务(得分)        C任务(得分) 
    2008-03-01       张三              80               90                 100 
    2008-03-01       李四              10               20                 30 
    2008-03-01       王五              60               60                 60 
    2008-03-02       张三              90               90                 90 
    2008-03-02       李四              20               20                 20 想得到如下查询结果 
    日期          张三A    张三B    张三C      李四A     李四B     李四C      王五A       王五B     王五C 
    2008-03-01   80       90      100       10        20        30        60          60       60 
    2008-03-02   90       90      90        20        20        20  
    ... 请高手帮忙,谢谢 
      

  3.   

    create table tb(日期 datetime,姓名 nvarchar(10),[A任务得分] int,[B任务得分] int,[C任务得分] int)
    insert tb select '2008-03-01'   ,   '张三'    ,          80    ,           90    ,             100  
    insert tb select '2008-03-01'   ,    '李四'   ,           10   ,            20   ,              30  
    insert tb select '2008-03-01'   ,    '王五'   ,           60   ,            60   ,              60  
    insert tb select '2008-03-02'   ,    '张三'   ,           90   ,            90   ,              90  
    insert tb select '2008-03-02'   ,    '李四'   ,           20   ,            20   ,              20declare @sql nvarchar(4000)
    set @sql=''
    select @sql=@sql+',max(case when 姓名='''+姓名+''' then [A任务得分] else 0 end) ['+姓名+'A任务]'
                    +',max(case when 姓名='''+姓名+''' then [B任务得分] else 0 end) ['+姓名+'B任务]'
                    +',max(case when 姓名='''+姓名+''' then [C任务得分] else 0 end) ['+姓名+'C任务]'
    from (select distinct 姓名 from tb) texec ('select convert(char(10),日期,120) 日期'+@sql+' from tb group by 日期')
    drop table tb/*
    日期         李四A任务       李四B任务       李四C任务       王五A任务       王五B任务       王五C任务       张三A任务       张三B任务       张三C任务
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    2008-03-01 10          20          30          60          60          60          80          90          100
    2008-03-02 20          20          20          0           0           0           90          90          90(2 行受影响)
    */
      

  4.   


    create table tb(日期 datetime,姓名 nvarchar(10),[A任务得分] int,[B任务得分] int,[C任务得分] int)
    insert tb select '2008-03-01'   ,   '张三'    ,          80    ,           90    ,             100  
    insert tb select '2008-03-01'   ,    '李四'   ,           10   ,            20   ,              30  
    insert tb select '2008-03-01'   ,    '王五'   ,           60   ,            60   ,              60  
    insert tb select '2008-03-02'   ,    '张三'   ,           90   ,            90   ,              90  
    insert tb select '2008-03-02'   ,    '李四'   ,           20   ,            20   ,              20
    declare @sql varchar(8000)
    set  @sql='select 日期'
    select @sql=@sql+',['+姓名+'A]=max(case 姓名 when '''+ 姓名 +''' then A任务得分 else 0 end)'
    +',['+姓名+'B]=max(case 姓名 when '''+ 姓名 +''' then B任务得分 else 0 end)'
    +',['+姓名+'C]=max(case 姓名 when '''+ 姓名 +''' then c任务得分 else 0 end)'
    from (select distinct 姓名 from tb)a
    exec(@sql+' from tb group by  日期')