name     subject     
A         语文      80
A         数学      80
A         外语      80                                     
B         数学      80         
B         外语      80
C         语文      78姓名   语文   数学  外语  avg
A      80     80    80     80
B      0      80    80     53
C      78     0     0      16请用sql语句将上面的表转换成下表....

解决方案 »

  1.   

    create table T(name  varchar(100),   subject varchar(100),      int)
    insert into T select 'A','语文','80'
    insert into T select 'A','数学','80'
    insert into T select 'A','外语','80'
    insert into T select 'B','数学','80'
    insert into T select 'B','外语','80'
    insert into T select 'C','语文','78'
    select 
          name,
          sum(case when subject ='语文' then  else 0 end ) as 语文,
          sum(case when subject ='数学' then  else 0 end ) as 数学,
          sum(case when subject ='外语' then  else 0 end ) as 外语,
          sum()/3 as d
    from T
    group by Namedrop table T
      

  2.   

    select 
          name as 姓名,
          sum(case when subject ='语文' then  else 0 end ) as 语文,
          sum(case when subject ='数学' then  else 0 end ) as 数学,
          sum(case when subject ='外语' then  else 0 end ) as 外语,
          sum()/3 as avg
    from T
    group by Name
      

  3.   

    select name,max(case subject when '数学' then  else 0 end )as [数学] ,
     max(case subject when '外语' then  else 0 end )as [外语] , 
    max(case subject when '语文' then  else 0 end )as [语文]  ,avg() as [平均分]
    from @t group by name
    */
      

  4.   

    普通行列转换假设有张学生成绩表(t)如下Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94想变成 
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94create table #t
    (
       Name    varchar(10) ,
       Subject varchar(10) ,
       Result  int
    )insert into #t(Name , Subject , Result) values('张三','语文','73')
    insert into #t(Name , Subject , Result) values('张三','数学','83')
    insert into #t(Name , Subject , Result) values('张三','物理','93')
    insert into #t(Name , Subject , Result) values('李四','语文','74')
    insert into #t(Name , Subject , Result) values('李四','数学','83')
    insert into #t(Name , Subject , Result) values('李四','物理','93')declare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then Result end) [' + Subject + ']'
    from (select distinct Subject from #t) as a
    set @sql = @sql + ' from #t group by name'
    exec(@sql) drop table #t--结果
    姓名       数学        物理        语文          
    ---------- ----------- ----------- ----------- 
    李四       83          93          74
    张三       83          93          73
     
    ----------------------------------------------------
    如果上述两表互相换一下:即姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94想变成 
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94create table #t
    (
       姓名 varchar(10) ,
       语文 int ,
       数学 int ,
       物理 int
    )insert into #t(姓名 , 语文 , 数学 , 物理) values('张三',73,83,93)
    insert into #t(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)select 姓名 as Name,'语文' as Subject,语文 as Result from #t union
    select 姓名 as Name,'数学' as Subject,数学 as Result from #t union
    select 姓名 as Name,'物理' as Subject,物理 as Result from #t
    order by 姓名 desc drop table #t
     
    --结果
    Name       Subject Result      
    ---------- ------- ----------- 
    张三       数学    83
    张三       物理    93
    张三       语文    73
    李四       数学    84
    李四       物理    94
    李四       语文    74(所影响的行数为 6 行)
      

  5.   

    create table T(name  varchar(100),   subject varchar(100),      int)
    insert into T select 'A','語文','80'
    insert into T select 'A','數學','80'
    insert into T select 'A','外語','80'
    insert into T select 'B','數學','80'
    insert into T select 'B','外語','80'
    insert into T select 'C','語文','78'--靜態sqlselect name ,
           sum(case when subject='語文' then  else 0 end)as '語文', 
           sum(case when subject='數學' then  else 0 end)as '數學',
           sum(case when subject='外語' then  else 0 end)as '外語'
    from t
    group by name--動態sqldeclare @str varchar(1000)
    set @str='select name '
    select @str=@str+',sum(case when subject='''+subject+''' then  else 0 end)as '''+subject+''''
    from t 
    group by subject
    select @str=@str+' from t group by name'
    exec(@str)
    name                                                                                                 外語          語文          數學          
    ---------------------------------------------------------------------------------------------------- ----------- ----------- ----------- 
    A                                                                                                    80          80          80
    B                                                                                                    80          0           80
    C                                                                                                    0           78          0
      

  6.   

    create table t(name varchar(03),subject varchar(10), int)
    insert into t
    select 'A','語文',80 union all
    select 'A','數學',80 union all
    select 'A','外語',80 union all
    select 'B','數學',80 union all
    select 'B','外語',80 union all
    select 'C','語文',78declare @sql varchar(8000),@count int
    select @count=count(distinct subject) from T
    set @sql='select name'
    select @sql=@sql+',sum(case when subject='''+subject+''' then  else 0 end) as '+subject
    from T
    group by subjectselect @sql=@sql+',sum(isnull(,0))/'+rtrim(@count)+' as [avg]  from t group by name'
    exec(@sql)
    /*
    name 外語          語文          數學          avg         
    ---- ----------- ----------- ----------- ----------- 
    A    80          80          80          80
    B    80          0           80          53
    C    0           78          0           26
    */
    drop table t
      

  7.   

    create table tb(name varchar(10),subject varchar(10), int)insert into tb values('A',         '语文',      80)
    insert into tb values('A',         '数学',      80)
    insert into tb values('A',         '外语',      80 )
    insert into tb values('B',         '数学',      80)
    insert into tb values('B',         '外语',      80)
    insert into tb values('C',         '语文',      78)select name ,
      max(case subject when '语文' then  else 0 end) '语文',
      max(case subject when '数学' then  else 0 end) '数学',
      max(case subject when '外语' then  else 0 end) '外语',
      sum()/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg]
    from tb
    group by namedrop table tb/*
    name       语文          数学          外语          avg         
    ---------- ----------- ----------- ----------- ----------- 
    A          80          80          80          80
    B          0           80          80          53
    C          78          0           0           26(所影响的行数为 3 行)
    */
      

  8.   

    --这个包含动态,静态create table tb(name varchar(10),subject varchar(10), int)insert into tb values('A',         '语文',      80)
    insert into tb values('A',         '数学',      80)
    insert into tb values('A',         '外语',      80 )
    insert into tb values('B',         '数学',      80)
    insert into tb values('B',         '外语',      80)
    insert into tb values('C',         '语文',      78)select name ,
      max(case subject when '语文' then  else 0 end) '语文',
      max(case subject when '数学' then  else 0 end) '数学',
      max(case subject when '外语' then  else 0 end) '外语',
      sum()/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg]
    from tb
    group by namedeclare @sql varchar(8000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when ''' + Subject + ''' then  else 0 end) [' + Subject + ']'
    from (select distinct Subject from tb) as a
    set @sql = @sql + ' ,sum()/(select max(cnt) cnt from (select name , count(*) cnt from tb group by name) t) [avg] from tb group by name'
    exec(@sql) drop table tb/*
    name       语文          数学          外语          avg         
    ---------- ----------- ----------- ----------- ----------- 
    A          80          80          80          80
    B          0           80          80          53
    C          78          0           0           26(所影响的行数为 3 行)姓名         数学          外语          语文          avg         
    ---------- ----------- ----------- ----------- ----------- 
    A          80          80          80          80
    B          80          80          0           53
    C          0           0           78          26
    */
      

  9.   

    剛才忘記求平均了create table T(name  varchar(100),   subject varchar(100),      int)
    insert into T select 'A','語文','80'
    insert into T select 'A','數學','80'
    insert into T select 'A','外語','80'
    insert into T select 'B','數學','80'
    insert into T select 'B','外語','80'
    insert into T select 'C','語文','78'--靜態sqlselect name ,
           sum(case when subject='語文' then  else 0 end)as '語文', 
           sum(case when subject='數學' then  else 0 end)as '數學',
           sum(case when subject='外語' then  else 0 end)as '外語',
           sum()/(select count(distinct subject)from t )
    from t
    group by name--動態sqldeclare @str varchar(1000)
    set @str='select name '
    select @str=@str+',sum(case when subject='''+subject+''' then  else 0 end)as '''+subject+''''
    from t 
    group by subject
    select @str=@str+',sum()/(select count(distinct subject ) from t) from t group by name'
    exec(@str)name                                                                                                 外語          語文          數學          avge        
    ---------------------------------------------------------------------------------------------------- ----------- ----------- ----------- ----------- 
    A                                                                                                    80          80          80          80
    B                                                                                                    80          0           80          53
    C                                                                                                    0           78          0           26