create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
我要的结果是:
张三 语文 74 数学 83 物理 93
李四 语文 74 数学 84 料理 94

解决方案 »

  1.   

    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    GO
    create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    goSELECT [姓名]
    ,'语文',MAX(CASE WHEN [课程]='语文' THEN [分数] ELSE NULL END)
    ,'数学',MAX(CASE WHEN [课程]='数学' THEN [分数] ELSE NULL END)
    ,'物理',MAX(CASE WHEN [课程]='物理' THEN [分数] ELSE NULL END)
    FROM TB
    GROUP BY [姓名]
    /*
    姓名                                                
    ---------- ---- ----------- ---- ----------- ---- -----------
    李四         语文   74          数学   84          物理   94
    张三         语文   74          数学   83          物理   93
    */
      

  2.   

    select 姓名,sum(case when 课程='语文' then 分数 else 0 end) 语文,
    sum(case when 课程='数学' then 分数 else 0 end) 数学,
    sum(case when 课程='物理' then 分数 else 0 end) 物理
    from tb 
    group by 姓名
      

  3.   


    select 姓名,max(case 课程 when '语文' then 课程 else null end) as 课程,
                max(case 课程 when '语文' then 分数 else 0 end) as 分数,
                max(case 课程 when '数学' then 课程 else null end) as 课程,
                max(case 课程 when '数学' then 分数 else 0 end) as 分数,
                max(case 课程 when '物理' then 课程 else null end) as 课程,
                max(case 课程 when '物理' then 分数 else 0 end) as 分数
    from tb
    group by 姓名姓名 课程 分数 课程 分数 课程 分数
    李四 语文 74 数学 84 物理 94
    张三 语文 74 数学 83 物理 93
      

  4.   


    结果
    李四 74 84 94
    张三 74 83 93这是适合科目固定的写法,多余的科目可以手工加上去,如果不固定,就要写动态的SQL语句了
      

  5.   

    动态的
    IF OBJECT_ID('TB') IS NOT NULL DROP TABLE TB
    GO
    create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go
    /*
    SELECT [姓名]
    ,'语文',MAX(CASE WHEN [课程]='语文' THEN [分数] ELSE NULL END)
    ,'数学',MAX(CASE WHEN [课程]='数学' THEN [分数] ELSE NULL END)
    ,'物理',MAX(CASE WHEN [课程]='物理' THEN [分数] ELSE NULL END)
    FROM TB
    GROUP BY [姓名]
    */
    DECLARE @SQL VARCHAR(MAX)
    SELECT @SQL=ISNULL(@SQL+',','SELECT [姓名] ,')+''''+[课程]+''',MAX(CASE WHEN [课程]='''+[课程]+''' THEN [分数] ELSE NULL END)'
    FROM TB
    GROUP BY [课程]
    EXEC (@SQL+' FROM TB
    GROUP BY [姓名]')
    /*
    李四 数学 84 物理 94 语文 74
    张三 数学 83 物理 93 语文 74
    */