/************ 如果同门课最高成绩相同的人员资料都会显示 ****************/
----学号 姓名 科目 成绩
----成绩表
select a.* from 成绩表 a where exists(select 1 from (
select max([成绩]) as 成绩,[科目] from 成绩表 group by [成绩],[科目]
)b where a.[科目]=b.[科目] and a.[成绩]=b.[成绩])
----学号 姓名 科目 成绩
----成绩表
select a.* from 成绩表 a where exists(select 1 from (
select max([成绩]) as 成绩,[科目] from 成绩表 group by [成绩],[科目]
)b where a.[科目]=b.[科目] and a.[成绩]=b.[成绩])
insert into @t
select 1, '张三', '语文', 80 union
select 2, '李四', '语文', 83 union
select 3, '王五', '英语', 99 union
select 4, '李四', '数学', 88 union
select 5, '张三', '英语', 66 union
select 6, '王五', '数学', 87 union
select 7, '李四', '英语', 69 union
select 8, '张三', '数学', 63 union
select 9, '王五', '语文', 77select * from @t a
where not exists
(
select 1 from @t b
where a.subject = b.subject and b.score > a.score
)
declare @t table(no int , name varchar(20) , subject varchar(20), score int)
insert into @t
select 1, '张三', '语文', 80 union
select 2, '李四', '语文', 83 union
select 3, '王五', '英语', 99 union
select 4, '李四', '数学', 88 union
select 5, '张三', '英语', 66 union
select 6, '王五', '数学', 87 union
select 7, '李四', '英语', 69 union
select 8, '张三', '数学', 63 union
select 9, '王五', '语文', 77
select * from @t b
inner join
(select subject,max(score) as score from @t
group by subject) a on a.subject=b.subject and b.score=a.score
学号字段与学生姓名没有绑定的话
那么就是说 即使是同样姓名的也不是同1个人
要不学号实际只是一个计数字段而已
当他是计数字段..那么就不管了
1楼的子查询 group by 可以不要成绩
join (select 科目,成绩=max(成绩) from 成绩表 group by 科目) b on (a.科目=b.科目 and a.成绩=b.成绩)
科目=a.科目 order by 成绩 desc)
FROM 成绩表
WHERE (成绩 IN
(SELECT MAX(成绩)
FROM 成绩表
GROUP BY 科目))
insert into @t
select 1, '张三', '语文', 80 union
select 2, '李四', '语文', 83 union
select 3, '王五', '英语', 99 union
select 4, '李四', '数学', 88 union
select 5, '张三', '英语', 66 union
select 6, '王五', '数学', 87 union
select 7, '李四', '英语', 69 union
select 8, '张三', '数学', 63 union
select 9, '王五', '语文', 77select * from @t a where 学号 in(select top 1 学号 from @t where 科目=a.科目 order by 成绩 desc)
join (select max(成绩) as 成绩 from 成绩表 group by 科目) b on b.成绩=a.成绩
(select max(成绩) from 成绩表 group by 姓名)
order by 学号;
(select max(成绩) from 成绩表 group by 科目)
order by 学号;
declare @t table(学号 int , 姓名 varchar(20) , 科目 varchar(20), 成绩 int)
insert into @t
select 1, '张三', '语文', 80 union
select 2, '李四', '语文', 83 union
select 3, '王五', '英语', 99 union
select 4, '李四', '数学', 88 union
select 5, '张三', '英语', 66 union
select 6, '王五', '数学', 87 union
select 7, '李四', '英语', 69 union
select 8, '张三', '数学', 63 union
select 9, '王五', '语文', 77select b.* from @t b
inner join
(select 科目,max(成绩) 成绩 from @t
group by 科目) a on a.科目=b.科目 and b.成绩=a.成绩这条SQL语句性能比较好吧, 应该比IN 的效率高.
select * from 成绩表 a where not exists(select 1 from 成绩表 where 科目=a.科目 and 成绩>a.成绩)
这个很方便啊,而且效率也比较高
from 成绩表 a
right join (select 科目,max(成绩) as 成绩
from 成绩表 group by 科目) as b
on a.科目=b.科目 and a.成绩=b.成绩
order by a.学号result:(有個疑問,學號怎麼和姓名不對應的?)学号 姓名 科目 成绩
----------- -------------------- -------------------- -----------
2 李四 语文 83
3 王五 英语 99
4 李四 数学 88
FROM 成绩表
WHERE (学号 IN
(SELECT 成绩表.学号
FROM 成绩表 INNER JOIN
(SELECT 科目, MAX(成绩) AS 最大成绩
FROM 成绩表
GROUP BY 科目) table2 ON 成绩表.科目 = table2.科目 AND
成绩表.成绩 = table2.最大成绩))
insert into @t
select 1, '张三', '语文', 80 union
select 2, '李四', '语文', 83 union
select 3, '王五', '英语', 99 union
select 4, '李四', '数学', 88 union
select 5, '张三', '英语', 66 union
select 6, '王五', '数学', 87 union
select 7, '李四', '英语', 69 union
select 8, '张三', '数学', 63 union
select 9, '王五', '语文', 77select a.no,a.name,a.subject from @t a
inner join
(select subject,max(score) as score from @t group by subject) b
on a.subject=b.subject and a.score=b.score
FROM 成绩表
WHERE (成绩 IN
(SELECT MAX(成绩)
FROM 成绩表
GROUP BY 科目))
这种方式不太行,成绩可能会出现相同的值,可以再加一层,根据学号(虽然学号只是代表记录号)来查询记录。
select 2, '李四', '语文', 83 union all
select 3, '王五', '英语', 99 union all
select 4, '李四', '数学', 88 union all
select 5, '张三', '英语', 66 union all
select 6, '王五', '数学', 87 union all
select 7, '李四', '英语', 69 union all
select 8, '张三', '数学', 63 union all
select 9, '王五', '语文', 77select * from #temp3
order by 科目,成绩select * from #temp3 as a where not exists (select 1 from #temp3 where 科目=a.科目 and 成绩>a.成绩)select a.* from #temp3 as a inner join
(select 科目,max(成绩) as '成绩'
from #temp3
group by 科目) as b on a.科目=b.科目 and a.成绩=b.成绩
FROM 成绩表
WHERE 学号 in
(select 学号 from
(SELECT 学号,科目,MAX(成绩) FROM 成绩表
GROUP BY 科目))
如果学号是学生的唯一编号,那么这个问题就非常简单了。
select 学号,姓名、科目、成绩 from 成绩表 as a,
(select 科目,max(成绩) as score from 成绩表 group by 科目) as b
where a.科目 = b.科目 and a.成绩 = b.score
现给出新的答案:SELECT *
FROM 成绩表
WHERE ((科目 + CONVERT(varchar, 成绩))) IN
(SELECT (科目 + CONVERT(varchar, MAX(成绩)))
FROM 成绩表
GROUP BY 科目)
(stu_id char(10),
stu_name char(20),
subject char(20),
grade numeric
)select #grade.* from
(select subject,max(grade) as grade
from #grade
group by subject) as temp1,#grade
where temp1.subject+'+'+str(temp1.grade) = #grade.subject+'+'+str(#grade.grade)???档
(
select a.obj,max(a.) from a
group by a.obj
) a, b
where a.obj=b.obj and a.=b.这个绝对可以!
insert into @t
select 1, '张三', '语文', 80 union
select 2, '李四', '语文', 83 union
select 3, '王五', '英语', 99 union
select 4, '李四', '数学', 88 union
select 5, '张三', '英语', 66 union
select 6, '王五', '数学', 87 union
select 7, '李四', '英语', 69 union
select 8, '张三', '数学', 63 union
select 9, '王五', '语文', 77Select * from @T order by [name]Select a.* from @t a,(Select subject,max(s) as s from @T group by subject) b where a.subject=b.subject and a.s=b.s