这个问题我不知道应该怎么描述,所以就取了一个可能不合适的标题。
问题是这样的,我的数据库里有这样一些记录:id  姓名     课程     成绩
1   张三     语文      80
2   李四     语文      70
3   王五     语文      60
4   张三     数学      81
5   李四     数学      71
6   王五     数学      61
7   张三     英语      84
8   李四     英语      74
9   王五     英语      64
……其中,每个学期的课程表有可能是不同的,例如,第一个学期学生有可能考语文、数学、英语;第二个学期学生有可能考语文、化学、物理。
现在,我想在网页中的显示结果为:姓名    语文    数学    英语
张三     80      81      84
李四     70      71      74
王五     60      61      64请问,要如何做才能实现该功能?

解决方案 »

  1.   

    参考:
    http://blog.csdn.net/xys_777/archive/2010/06/22/5685953.aspx
      

  2.   

    SQL语句之普通行列转换 
     
    假设有张学生成绩表(tb_rowtocol)如下
    Name Subject Result
    张三 语文  73
    张三 数学  83
    张三 物理  93
    李四 语文  74
    李四 数学  84
    李四 物理  94想变成 
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94declare @sql varchar(4000)
    set @sql = 'select Name as ' + '姓名'
    select @sql = @sql + ' , sum(case Subject when '''+Subject+''' then Result end) ['+Subject+']'
    from (select distinct Subject from rowtocol) as a
    set @sql = @sql + ' from rowtocol group by name'
    exec(@sql) 
     
    如果上述两表互相换一下:即
    表名(cj)
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94 
      

  3.   

    SQL行转咧,楼上的地址已经分析很详细了哈。
      

  4.   


    create table tb([ID] int,姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values(1,'张三' , '语文' , 80)
    insert into tb values(2,'李四' , '语文' , 70)
    insert into tb values(3,'王五' , '语文' , 60)
    insert into tb values(4,'张三' , '数学' , 81)
    insert into tb values(5,'李四' , '数学' , 71)
    insert into tb values(6,'王五' , '数学' , 61)
    insert into tb values(7,'张三' , '英语' , 84)
    insert into tb values(8,'李四' , '英语' , 74)
    insert into tb values(9,'王五' , '英语' , 64)
    select * from tbselect 姓名 as 姓名,
    max(case 课程 when '语文' then 分数 else 0 end)语文,
    max(case 课程 when '数学' then 分数 else 0 end)数学,
    max(case 课程 when '英语' then 分数 else 0 end)英语
    from tb
    group by 姓名
      

  5.   

    BEGIN
    if object_id('tempdb.dbo.#T') is not null drop table #Tselect Name  as '名字', Subject  as  '课程'  into #T  from tb_rowtocol group by Name  DECLARE @COUNT INT
    SELECT @COUNT=COUNT(1) FROM #T
    IF @COUNT>0
    BEGIN
    declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+',ISNULL(max(case when 课程='''+课程+''' then Resultend),0) ['+课程+']'
    from #T group by 课程set @sql=stuff(@sql,1,1,'')exec ('select 名字, '+@sql+' from #T group by 名字')
    END
    我这段时间一直在写这个,把我的改了下
    结果为:
    姓名 语文 数学 物理
    张三 73  83  93
    李四 74  84  94  
      

  6.   

    select name as 姓名 ,
       max(case kemu when 'YW' then corse else 0 end) 语文,
       max(case kemu when 'SX' then corse else 0 end) 数学,
       max(case kemu when 'YY' then corse else 0 end) 英语
    from text
    group by name
      

  7.   

    如果列固定,比如一年12个月等,这样实现比如容易,逻辑上也比较顺。如果像你这样
    语文、数学、英语
    语文、化学、物理
    其实是动态列,access倒是直接交叉表就可以,sql server麻烦点,要分两次查询,而且后期代码里处理也比较麻烦,列名不知道了,多少列也不知道了,全部只能动态显示,扩展性比较弱了