表A:
   Subject   Stuname   Score
     语文    李四      85
     语文    张三      94
     语文    王五      83
     语文    赵六      83
     数学    李四      92
     数学    张三      94
     数学    王五      90
     数学    赵六      98     
表B:
   Subjiect    第一名        第二名       第三名
     语文      张三,94       李四,85      王五,83
     数学      赵六,98       张三,94      李四,92
如何写一SQL语句,由表A得到表B?若并列,则按名字顺序优先;请教高手!谢谢!
     

解决方案 »

  1.   

    行转列问题,http://blog.csdn.net/dba_huangzj/article/details/7530928可以看看我的文章,希望对你有帮助,查询出来的结果再order by名字
      

  2.   


    select Subject,[1] 第一名,[2] 第二名,[3] 第三名 from (
    select row_number() over(partition by Subject order by Subject,Score desc) rn,
    Subject,(Stuname+','+cast(Score as varchar(20))) seq
    from A) t
    pivot(max(seq) for rn in ([1],[2],[3])) t1; 
    Subject 第一名                     第二名                     第三名
    ------- ----------------------- ----------------------- -----------------------
    语文      张三,94                   李四,85                   王五,83
    数学      赵六,98                   张三,94                   李四,92(2 行受影响)
      

  3.   


    IF object_id('[A]')  is  not null
    drop table [A]
    GO
    create table A(Subject nvarchar(10),Stuname nvarchar(10),Score varchar(10))
    insert into  [A]
    select  '语文','李四','85' union all
    select  '语文','张三','94' union all
    select  '语文','王五','83' union all
    select  '语文','赵六','83' union all
    select  '数学','李四','92' union all
    select  '数学','张三','94' union all
    select  '数学','王五','90' union all
    select  '数学','赵六','98' select  Subject,
            [1] 第一名,
            [2] 第二名,
            [3] 第三名 
    from (
         select row_number() over(partition by Subject order by Subject,Score desc) rn,
            Subject,([Stuname]+','+[Score]) seq
              from [A]) t
    pivot(max(seq) for rn in ([1],[2],[3])) t1; 
    /*
    Subject    第一名                      第二名                       第三名
    语文       张三,94                   李四,85                   王五,83
    数学       赵六,98                   张三,94                   李四,92(2 行受影响)*/