create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
insert into #tb values(1,'张三' , '语文' , 'a')
insert into #tb values(2,'张三' , '数学' , 'b')
insert into #tb values(3,'张三' , '物理' , 'c')
insert into #tb values(4,'李四' , '语文' , 'd')
insert into #tb values(5,'李四' , '数学' , 'e')
insert into #tb values(6,'李四' , '物理' , 'f')select * from #tb  
drop table #tb
我现在想实现的是:课程成为列名、然后分值对应到下面。怎么实现?
谢谢.... 我看着有转换成xml的、有用case的、有用函数PIVOT的啊 给我提供一个思路或者是存储过程呗。。

解决方案 »

  1.   

     SELECT 姓名, MAX(CASE 课程 WHEN '语文' THEN 分值 ELSE 0 END) AS '语文', MAX(CASE 课程 WHEN '数学' THEN Score ELSE 0 END) AS '数学', MAX(CASE 课程 WHEN '物理' THEN Score ELSE 0 END) AS '物理' FROM [#tb] GROUP BY 姓名
      

  2.   

    refer:
    http://www.cnblogs.com/insus/archive/2012/03/28/2421230.html
      

  3.   

    http://topic.csdn.net/u/20100412/22/fec647ea-73d0-480b-92e9-8af61ef3c978.html
      

  4.   

    SELECT 姓名,语文,数学,物理 FROM
    (
    select 姓名,课程,分值 from #tb  
    ) AS a
    PIVOT
    (
    MAX(分值) FOR 课程 IN (语文,数学,物理)
    ) AS pvt
      

  5.   

    姓名 语文 数学 物理
    李四 d e f
    张三 a b c
      

  6.   


    我就要的是你的写的结果啊。可是你这样是不行的。max是聚合函数啊 我的值是文本啊。不能max的啊
      

  7.   

    你的值再怎么是文本也在某一列里吧?
    此处加聚合函数的意思是 
    如果你有多条数据 例如create table #tb(id int ,姓名 varchar(10) , 课程 varchar(10) , 分值 varchar(10) )
    insert into #tb values(1,'张三' , '语文' , 'a')
    insert into #tb values(2,'张三' , '数学' , 'b')
    insert into #tb values(3,'张三' , '物理' , 'c')
    insert into #tb values(4,'李四' , '语文' , 'd')
    insert into #tb values(5,'李四' , '数学' , 'e')
    insert into #tb values(6,'李四' , '物理' , 'f')
    insert into #tb values(6,'李四' , '物理' , 'g')  -- 此处有2个李四的物理成绩,得用聚合函数合并,至于如何合并,取决于你,我一般都是用MAX来定义的,其实此处出现2个李四的物理成绩是错误的,应该在录入的时候就提醒录入的人。
      

  8.   

    请大家看好啊。。哎 我那是 a b c d 不是数字
      

  9.   

    sql有 PIVOT 关键字,你可查一查帮助.