表A:
Subject Stuname Score
语文 李四 85
语文 张三 94
语文 王五 83
语文 赵六 83
数学 李四 92
数学 张三 94
数学 王五 90
数学 赵六 98
表B:
Subjiect 第一名 第二名 第三名
语文 张三,94 李四,85 王五,83
数学 赵六,98 张三,94 李四,92
如何写一SQL语句,由表A得到表B?若并列,则按名字顺序优先;请教高手!谢谢!
Subject Stuname Score
语文 李四 85
语文 张三 94
语文 王五 83
语文 赵六 83
数学 李四 92
数学 张三 94
数学 王五 90
数学 赵六 98
表B:
Subjiect 第一名 第二名 第三名
语文 张三,94 李四,85 王五,83
数学 赵六,98 张三,94 李四,92
如何写一SQL语句,由表A得到表B?若并列,则按名字顺序优先;请教高手!谢谢!
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 行受影响)
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 行受影响)*/