求一SQL,各班級各科前幾名的學生成績

jastion 2009-08-13 09:58:34
班級 姓名 學科 分數
9901 a1 數學 50
9901 b1 化學 80
9901 c1 物理 82
9902 a2 化學 86
9902 b2 數學 88
9902 c2 物理 90
...全文
709 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuhuzhangwei 2009-10-02
  • 打赏
  • 举报
回复
select top ? * from 表 where 班级='班级' and 学科='学科' order by 分数 desc
jenny0810 2009-09-30
  • 打赏
  • 举报
回复
学习
cxmcxm 2009-09-29
  • 打赏
  • 举报
回复
select top 5/*要几名此填入几*/ * from 表 where 班级='要查的班级' and 学科='要查的学科' order by 分数 desc
libin_j2ee_1005 2009-09-29
  • 打赏
  • 举报
回复
select fileds from table where scor > (select distinct (score) from table order by score desc limit 1,20)

limit 就是你要查的条数,这个应该符合你的要求了吧?
xia258058187 2009-08-13
  • 打赏
  • 举报
回复
select * from (select dense_rank() over(partition by 班级,学科 order by 分数 desc) rk,tb.* from tb) T
where T.rk<=3;--每班每门科目的前3名的分数
watermelon_2008 2009-08-13
  • 打赏
  • 举报
回复
测试数据表:
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([banji] int,[xingming] varchar(2),[xueke] varchar(4),[fenshu] int)
insert [tb]
select 9901,'a1','數學',50 union all
select 9901,'b1','化學',80 union all
select 9901,'c1','物理',82 union all
select 9902,'a2','化學',86 union all
select 9902,'b2','數學',88 union all
select 9902,'c2','物理',90

查询方法:
select * from tb T where 1>(SELECT COUNT(*) FROM tb WHERE banji=T.banji and xueke=T.xueke AND fenshu>T.fenshu) order by banji,xueke,fenshu desc

取各班各科第一名~如果取前几名,请将1改为对应的数字。
zhengduan964532 2009-08-13
  • 打赏
  • 举报
回复
select top 1 * from [tb] order by 分數 desc
最快
黄_瓜 2009-08-13
  • 打赏
  • 举报
回复
--声明,借用xiaoF的数据
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([班級] int,[姓名] varchar(2),[學科] varchar(4),[分數] int)
insert [tb]
select 9901,'a1','數學',50 union all
select 9901,'b1','化學',80 union all
select 9901,'c1','物理',82 union all
select 9902,'a2','化學',86 union all
select 9902,'b2','數學',88 union all
select 9902,'c2','物理',90
select 班級,姓名, 學科,分數 from
(
select a.*,id=(select count(1) from tb where [學科]=a.[學科] and [分數]>=a.[分數]) from tb a) t
where t.id<=2--取前两条
order by [學科],[分數] desc--刚才排序出了问题
/*
班級 姓名 學科 分數
----------- ---- ---- -----------
9902 a2 化學 86
9901 b1 化學 80
9902 b2 數學 88
9901 a1 數學 50
9902 c2 物理 90
9901 c1 物理 82

(6 行受影响)


*/
黄_瓜 2009-08-13
  • 打赏
  • 举报
回复
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([班級] int,[姓名] varchar(2),[學科] varchar(4),[分數] int)
insert [tb]
select 9901,'a1','數學',50 union all
select 9901,'b1','化學',80 union all
select 9901,'c1','物理',82 union all
select 9902,'a2','化學',86 union all
select 9902,'b2','數學',88 union all
select 9902,'c2','物理',90
select 班級,姓名, 學科,分數 from
(
select a.*,id=(select count(1) from tb where [學科]=a.[學科] and [分數]>=a.[分數]) from tb a) t
where t.id<=2--取前两条
order by t.id desc
/*
班級 姓名 學科 分數
----------- ---- ---- -----------
9901 a1 數學 50
9901 b1 化學 80
9901 c1 物理 82
9902 a2 化學 86
9902 b2 數學 88
9902 c2 物理 90

(6 行受影响)


*/
--小F-- 2009-08-13
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F 向高手学习)
-- Date :2009-08-13 10:01:01
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([班級] int,[姓名] varchar(2),[學科] varchar(4),[分數] int)
insert [tb]
select 9901,'a1','數學',50 union all
select 9901,'b1','化學',80 union all
select 9901,'c1','物理',82 union all
select 9902,'a2','化學',86 union all
select 9902,'b2','數學',88 union all
select 9902,'c2','物理',90
--------------开始查询--------------------------

SELECT * FROM tb AS T WHERE 2>(SELECT COUNT(*) FROM tb WHERE 學科=T.學科 AND 分數>T.分數) order by 學科 desc
----------------结果----------------------------
/*班級 姓名 學科 分數
----------- ---- ---- -----------
9901 c1 物理 82
9902 c2 物理 90
9902 b2 數學 88
9901 a1 數學 50
9901 b1 化學 80
9902 a2 化學 86

(所影响的行数为 6 行)


*/
黄_瓜 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 liangck 的回复:]
SQL codeselect*from(select rnk=dense_rank()over(partitionby 班级,学科ORDERBY 分数DESC),*from tb
)as twhere rnk<=5--各班各科前5名
[/Quote]
up
--小F-- 2009-08-13
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :fredrickhu(小F 向高手学习)
-- Date :2009-08-13 10:01:01
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([班級] int,[姓名] varchar(2),[學科] varchar(4),[分數] int)
insert [tb]
select 9901,'a1','數學',50 union all
select 9901,'b1','化學',80 union all
select 9901,'c1','物理',82 union all
select 9902,'a2','化學',86 union all
select 9902,'b2','數學',88 union all
select 9902,'c2','物理',90
--------------开始查询--------------------------

select top 3 * from [tb] order by 分數 desc
----------------结果----------------------------
/*班級 姓名 學科 分數
----------- ---- ---- -----------
9902 c2 物理 90
9902 b2 數學 88
9902 a2 化學 86

(所影响的行数为 3 行)
*/
liangCK 2009-08-13
  • 打赏
  • 举报
回复
select *
from(
select rnk=dense_rank() over(partition by 班级,学科 ORDER BY 分数 DESC),*
from tb
) as t
where rnk <= 5 --各班各科前5名
htl258_Tony 2009-08-13
  • 打赏
  • 举报
回复
---------------------------------
-- Author: liangCK 小梁
-- Title : 查每个分组前N条记录
-- Date : 2008-11-13 17:19:23
---------------------------------

--> 生成测试数据: #T
IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
CREATE TABLE #T (ID VARCHAR(3),GID INT,Author VARCHAR(29),Title VARCHAR(39),Date DATETIME)
INSERT INTO #T
SELECT '001',1,'邹建','深入浅出SQLServer2005开发管理与应用实例','2008-05-10' UNION ALL
SELECT '002',1,'胡百敬','SQLServer2005性能调校','2008-03-22' UNION ALL
SELECT '003',1,'格罗夫Groff.J.R.','SQL完全手册','2009-07-01' UNION ALL
SELECT '004',1,'KalenDelaney','SQLServer2005技术内幕存储引擎','2008-08-01' UNION ALL
SELECT '005',2,'Alex.Kriegel.Boris.M.Trukhnov','SQL宝典','2007-10-05' UNION ALL
SELECT '006',2,'飞思科技产品研发中心','SQLServer2000高级管理与开发','2007-09-10' UNION ALL
SELECT '007',2,'胡百敬','SQLServer2005数据库开发详解','2008-06-15' UNION ALL
SELECT '008',3,'陈浩奎','SQLServer2000存储过程与XML编程','2005-09-01' UNION ALL
SELECT '009',3,'赵松涛','SQLServer2005系统管理实录','2008-10-01' UNION ALL
SELECT '010',3,'黄占涛','SQL技术手册','2006-01-01'

--SQL查询如下:

--按GID分组,查每个分组中Date最新的前2条记录


--1.字段ID唯一时:
SELECT * FROM #T AS T WHERE ID IN(SELECT TOP 2 ID FROM #T WHERE GID=T.GID ORDER BY Date DESC)

--2.如果ID不唯一时:
SELECT * FROM #T AS T WHERE 2>(SELECT COUNT(*) FROM #T WHERE GID=T.GID AND Date>T.Date)

--SQL Server 2005 使用新方法

--3.使用ROW_NUMBER()进行排位分组
SELECT ID,GID,Author,Title,Date
FROM
(
SELECT rid=ROW_NUMBER() OVER(PARTITION BY GID ORDER BY Date DESC),*
FROM #T
) AS T
WHERE rid<=2

--4.使用APPLY
SELECT DISTINCT b.*
FROM #T AS a
CROSS APPLY
(
SELECT TOP(2) * FROM #T WHERE a.GID=GID ORDER BY Date DESC
) AS b


--结果
/*

ID GID Author Title Date
---- ----------- ----------------------------- --------------------------------------- -----------------------
003 1 格罗夫Groff.J.R. SQL完全手册 2009-07-01 00:00:00.000
004 1 KalenDelaney SQLServer2005技术内幕存储引擎 2008-08-01 00:00:00.000
005 2 Alex.Kriegel.Boris.M.Trukhnov SQL宝典 2007-10-05 00:00:00.000
007 2 胡百敬 SQLServer2005数据库开发详解 2008-06-15 00:00:00.000
009 3 赵松涛 SQLServer2005系统管理实录 2008-10-01 00:00:00.000
010 3 黄占涛 SQL技术手册 2006-01-01 00:00:00.000

(6 行受影响)
*/





SQL77 2009-08-13
  • 打赏
  • 举报
回复
SELECT 班级,学科,MAX(分数) 分数 FROM TB GROUP BY 班级,学科
??第一名
软件工程实践报告 教务管理系统 第一章 问题定义 随着学校规模的扩大,人员的不断增加、复杂程度逐渐增强,学校中,教务是一项繁 琐的事,每年都有新生入学、老生毕业,以及其他各种人事变动。每学期的考试成绩都 需要分析,纵、横向比较,能及时反应信息,还要对教师的教学成绩考核提供数据。如 何有效地管理、分析、处理这些信息,帮助学校和教师掌握学生的情况,这就是教学信 息管理系统需要完成的功能。以简单的用Excel来打印几X报表的人机作坊再也无法适 应当今学校的教学管理了,比方用Excel虽然能简单管理学生的学籍、成绩等,但用户界 面简单,管理起来难度大,修改和查找学生的信息都比较麻烦,并且在操作过程中没有 用户权限,只要能翻开计算机的人就能翻开数据进展任意的修改,大大的降低了信息的 平安性和XX性,效率低,,人工的大量浪费;另外时间一长,将产生大量的文件和数据,这对 于查找、更新和维护都带来了不少困难。随着科学技术的不断提高,计算机科学日渐成熟 ,其强大的功能已为人们深刻认识,它已进入各个领域并发挥着来越重要的作用。 作为计算机应用的一局部,使用计算机对学校的各类信息进展管理,具有着手工管理所 无法比较的优点.例如:检索迅速、查询方便、效率高、可靠性好、存储量大、XX性好、 寿命长、本钱低等。这些优点能够极大地提高学校信息管理的效率。 1.1问题定义 1.所需资源: 硬盘>80G,内存>256,处理器一般以上水平即可。 2.系统名为:教务管理系统 〔1〕,本处理的信息主要有三大类:学生信息、教师信息、成绩数据。本系统主要着 手于以上三大局部,建立数据库以及对数据的各种操作功能。 对于学生信息,由于需要经常性地进展各种查询。例如:查询一个班级中团员的人数 ,男女生的人数等等。教诲处在每一届学生进校时必须进展分班,设置学号;每一届学 生毕业,要进展学生信息备份; 对于教师信息,学校教诲处跟据教师所教班的成绩对教师的成绩成行考核,可以进展 同科的纵横向比较。〔由于对教师方面不太了解只有这些〕 对于成绩管理,课任教师要进展本科目成绩登记,计算平均分、优秀率、及格率;教 诲处要分段统计学生人数及所占比列,每学期进展学生成绩备份;学校领导那么可通过 查询工具来了解学生成绩情况。 〔2〕,以上各类信息目还处于手工或半手工的管理状态,效率低,可靠性差。如 果采用计算机进展以上各类信息的管理,必将大大提高工作效率,对各类信息的维护及 了解起到积极的作用。因此一个功能完备的学校信息管理系统的开发都非常有必要。 第二章 可行性研究 2.1系统概述 本系统将采用面向对象的软件开发方法,以SQL 2000作为后台数据库,配合功能强大的SQL查询语句,用Delphi便捷地开发教学管理信息 系统的应用程序。 2.2.1可行性分析 A 技术可行性:对Delphi能够运用自如,对SQL语句熟练掌握运用。 B 经济可行性:开发费用合理 C 操作可行性:能够良好的解决用户需要的问题 第三章 总体设计 3.1系统功能描述 本系统的主要任务是实现对学校的学生信息管理、成绩管理、教师考核信息管理、课 程信息管理及相关查询。其主要功能包括: 1.学生信息管理功能 添加学生.以班级为单位,进展学生入库。其中分为单个添加和成批添加。单个添 加学生供数量较少的学生信息入库;学籍变更。提供学生转学、休学、复学、退学、留 级及毕业信息。 删除学生。当学生毕业后,学生信息转移备份数据库中,系统的根本数据库中需要 删除学生信息。该功能主要进展成批地删除学生信息,如连续学号区段的多位学生信息 删除,整个班级的删除,所有学生信息的删除。 学生信息备份。在学生信息删除,将其按班级为单位保存到备份数据库 2.学生成绩管理功能 分数录入。以班级为单位,录入成绩。 分数段统计。以班为单位,根据成绩统计各科各分数段的人数,总分各分数段的人数。 成绩备份。为指定班级及指定的学期数的学生成绩保存到备份数据库中。 3.教师信息管理功能 添加新教师。 教师信息的修改。 教师成绩考核。 4.课程信息管理功能 1.课程管理。提供本学期各年级各专业所开课程名称的录入、修改、删除。它是学生 成绩管理的根底。用以保证数据库中一致性原那么。 2.教师与课程。供录入课任教师与课程、班级的联系情况。是排课系统的根底。 5.查询功能。 学生信息查询。根据用户的要求,查询学生数据库的所有可能的信息,其中包括成绩查 询。 教师信息查询。根据用户的要求,查询相关教师信息。 备份成绩查询。按班级为单位查询备份数据库的学生信息。 3.2 数据流图与数据字典 3.2.1数据流图 根据以上的系统功能描述,设计出数据流图如下: 1. 根本数据流图与功能级数据流图〔图3-1至图3-2〕 3.2.2查询功能流程图 总分表成绩表 学生信息查询要求查询

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧