select 
  姓名=case when 学科=(select min(学科) from TB where 姓名=A.姓名) then 姓名 else '' end,
  年龄,学科
from TB A

解决方案 »

  1.   

    declare @T table (姓名 varchar(20),年龄 int,学科 varchar(20))
    insert @T select '小王' , 18 ,   '语文' 
    insert @T select '小王' , 18 ,   '数学' 
    insert @T select '小王' , 18 ,   '外语' 
    insert @T select '小王' , 18 ,   '历史'
    insert @T select '小李' , 18 ,   '语文' 
    insert @T select '小李' , 18 ,   '数学' 
    insert @T select '小李' , 18 ,   '外语' 
    insert @T select '小李' , 18 ,   '历史'
    select 
      姓名=case when 学科=(select max(学科) from @T where 姓名=A.姓名) then 姓名 else '' end,
      年龄,学科
    from @T A
    order by case when 姓名='' then 2 else 1 end/*
    姓名                   年龄          学科
    -------------------- ----------- --------------------
    小王                   18          语文
                         18          数学
                         18          外语
                         18          历史
    小李                   18          语文
                         18          数学
                         18          外语
                         18          历史(8 行受影响)
    */
      

  2.   

    create table tb(姓名 varchar(10), 年龄 varchar(10) ,  学科 varchar(10))
    insert into tb values('小王',  18,    '语文') 
    insert into tb values('小王',  18,    '数学') 
    insert into tb values('小王',  18,    '外语') 
    insert into tb values('小王',  18,    '历史')  
    goselect 
      姓名 = case when 学科 = (select max(学科) from tb where 姓名 = A.姓名) then 姓名 else '' end,
      年龄 = case when 学科 = (select max(学科) from tb where 姓名 = A.姓名) then 年龄 else '' end,
      学科
    from tb A
    order by 姓名 descdrop table tb/*
    姓名         年龄      学科         
    ---------- ---------- ---------- 
    小王         18       语文
                          数学
                          外语
                          历史(所影响的行数为 4 行)
    */
      

  3.   

    --这些方法.则是用拼音去判断..当你有科目的首字母拼音是在Y后面的.那就不对了.
    --2005的
    declare @T table (姓名 varchar(20),年龄 int,学科 varchar(20))
    insert @T select '小王' , 18 ,   '语文' 
    insert @T select '小王' , 18 ,   '数学' 
    insert @T select '小王' , 18 ,   '外语' 
    insert @T select '小王' , 18 ,   '历史'
    insert @T select '小李' , 18 ,   '语文' 
    insert @T select '小李' , 18 ,   '数学' 
    insert @T select '小李' , 18 ,   '外语' 
    insert @T select '小李' , 18 ,   '历史'select case when 学科=min_k then 姓名 else '' end 姓名,
           年龄,学科
    from
    (
      select *,max(学科) over(partition by 姓名) min_k
      from @T
    ) t
    order by case when 姓名='' then 1 else 0 end/*
    姓名                   年龄          学科
    -------------------- ----------- --------------------
    小李                   18          语文
                         18          数学
                         18          外语
                         18          历史
    小王                   18          语文
                         18          数学
                         18          外语
                         18          历史(8 行受影响)
    */