问题:假设有张学生成绩表(tb)如下:
姓名 课程  分数
张三 语文   74
张三 英语   83
张三 物理   93
李四 语文   74
李四 数学   84
李四 物理   94
王五 计算机 86
王五 英语   90
想变成(得到如下结果):若出现
姓名 课程 分数
---- ---- ----
李四 英语  94
张三 物理  93
王五 英语  90
--------------
即把最大成绩取出来的SQL语句怎么写???create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int);
insert into cj values('张三' , '语文' , 74);
insert into cj values('张三' , '英语' , 83);
insert into cj values('张三' , '物理' , 93);
insert into cj values('李四' , '语文' , 74);
insert into cj values('李四' , '数学' , 84);
insert into cj values('李四' , '物理' , 94);
insert into cj values('王五' , '计算机',80);
insert into cj values('王五' , '英语',  85);

解决方案 »

  1.   

    select 
      *
    from
     tb t 
    where 
      分数=(select max(分数) from tb where 姓名=t.姓名)
      

  2.   

    select a.*
    from tb as a
        join (select 姓名,max(分数) as 分数 from tb
               group by 姓名) as b
    on a.姓名=b.姓名 and a.分数=b.分数
      

  3.   

    create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int); 
    insert into cj values('张三' , '语文' , 74); 
    insert into cj values('张三' , '英语' , 83); 
    insert into cj values('张三' , '物理' , 93); 
    insert into cj values('李四' , '语文' , 74); 
    insert into cj values('李四' , '数学' , 84); 
    insert into cj values('李四' , '物理' , 94); 
    insert into cj values('王五' , '计算机',80); 
    insert into cj values('王五' , '英语',  85); 
    select 
      *
    from
     cj t 
    where 
      分数=(select max(分数) from cj where 姓名=t.姓名)
    /*姓名         课程         分数
    ---------- ---------- -----------
    张三         物理         93
    王五         英语         85
    李四         物理         94(3 行受影响)
    */
      

  4.   


    create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int); 
    insert into cj values('张三' , '语文' , 74); 
    insert into cj values('张三' , '英语' , 83); 
    insert into cj values('张三' , '物理' , 93); 
    insert into cj values('李四' , '语文' , 74); 
    insert into cj values('李四' , '数学' , 84); 
    insert into cj values('李四' , '物理' , 94); 
    insert into cj values('王五' , '计算机',80); 
    insert into cj values('王五' , '英语',  85); 
    go
    select * from cj a where not exists (select 1 from cj where a.姓名=姓名 and 分数>a.分数)
    go
    drop table cj
    go/*(1 行受影响)
    姓名         课程         分数
    ---------- ---------- -----------
    张三         物理         93
    李四         物理         94
    王五         英语         85(3 行受影响)
    */
      

  5.   


    select * from cj a where [分数]= 
    (select max([分数]) from cj b where b.[姓名] = a.[姓名] group by [姓名])
      

  6.   

    use tempdb
    if object_id('tb') is not null drop table tb
    go
    create table tb([姓名] varchar(50),[课程] varchar(50),[分数] INT)
    insert into tb
    select '张三','语文',74 union all
    select '张三','英语',83 union all
    select '张三','物理',93 union all
    select '李四','语文',74 union all
    select '李四','数学',84 union all
    select '李四','物理',94 union all
    select '王五','计算机',86 union all
    select '王五','英语',90 
    go
    select * from tbselect * from tb t
    where not exists(select 1 from tb where 姓名=t.姓名 and 分数 > t.分数)/*
    姓名            课程       分数
    ------------- ----------  ----------
    张三            物理       93
    李四            物理       94
    王五            英语       90
    */
      

  7.   

    SQL2005:;with cte as
    (
    select *,row_number() over(partition by 姓名 order by 分数 desc) as rn from tb
    )
    select 姓名,课程,分数 from cte where rn = 1/*
    姓名            课程            分数
    ------------- ------------- -----------
    李四            物理            94
    王五            英语            90
    张三            物理            93
    */
      

  8.   

    8楼有误,应该用rank,
    use tempdb
    if object_id('tb') is not null drop table tb
    go
    create table tb([姓名] varchar(50),[课程] varchar(50),[分数] INT)
    insert into tb
    select '张三','语文',74 union all
    select '张三','英语',93 union all
    select '张三','物理',93 union all
    select '李四','语文',74 union all
    select '李四','数学',84 union all
    select '李四','物理',94 union all
    select '王五','计算机',86 union all
    select '王五','英语',90 
    go;with cte as
    (
    select *,rank() over(partition by 姓名 order by 分数 desc) as rn from tb
    )
    select 姓名,课程,分数 from cte where rn = 1/*
    姓名            课程             分数
    ------------- -------------- -----------
    李四            物理             94
    王五            英语             90
    张三            英语             93
    张三            物理             93
    */
      

  9.   


    select * from cj t where not exists(select 1 from cj where 姓名=t.姓名 and 分数>t.分数)
      

  10.   


    --sinpoal
    if object_id('cj')is not null drop table cj
    create table cj(姓名 varchar(10) , 课程 varchar(10) , 分数 int); 
    insert into cj values('张三' , '语文' , 74); 
    insert into cj values('张三' , '英语' , 83); 
    insert into cj values('张三' , '物理' , 93); 
    insert into cj values('李四' , '语文' , 74); 
    insert into cj values('李四' , '数学' , 84); 
    insert into cj values('李四' , '物理' , 94); 
    insert into cj values('王五' , '计算机',80); 
    insert into cj values('王五' , '英语',  85); 
    ------sqlstatement--------
    select * from cj jwhere 分数 in (select max(分数) from cj group by 姓名) 
    --------result---------
    /*
    姓名    课程    分数 
    ----   ----   ---- 
    张三 物理 93
    李四 物理 94
    王五 英语 85
    -------------- */
      

  11.   

    select 
      *
    from
     tb t 
    where 
      分数=(select max(分数) from tb where 姓名=t.姓名)
      

  12.   

    select Top 3 name As 姓名,kc As 课程,score  As 成绩 from cj order by score desc
      

  13.   

    select *
    from cj
    where 分数 in(select max(分数) from cj group by 姓名)
    order by 分数 desc
      

  14.   

    select 
      *
    from
     cj t 
    where 
      分数=(select max(分数) from cj where 姓名=t.姓名)
      

  15.   

    select * from cj order by 分数  desc
      

  16.   

    select 姓名,max(分数) as 分数 from cj  group by 姓名 order by 分数 desc
      

  17.   

    SELECT *
    FROM cj t
    WHERE (分数 =
              (SELECT MAX(分数)
             FROM cj
             WHERE 姓名 = t.姓名))