sql从学生成绩表中查出各科成绩分布最多的记录

题目:有一个数据表student,包含name(姓名),dept(科目),score(成绩)三个字段,现在要求查出每科成绩分数分布最多的项,如语文成绩80分最多,就输出语文80分的人数,数学90分的人最多,输出数学90分的人数;

测试数据:

insert into student values ("deng","80","语文");

insert into student values ("zhang","80","语文");

insert into student values ("li","70","语文");

insert into student values ("xiong","85","语文");

insert into student values ("bao","60","语文");

insert into student values ("king","80","语文");

insert into student values ("ying","90","语文");

insert into student values ("hong","60","语文");

insert into student values ("deng","90","数学");

insert into student values ("zhang","80","数学");

insert into student values ("li","80","数学");

insert into student values ("xiong","65","数学");

insert into student values ("bao","60","数学");

insert into student values ("king","80","数学");

insert into student values ("ying","90","数学");

insert into student values ("hong","60","数学");

insert into student values ("deng","70","英语");

insert into student values ("zhang","85","英语");

insert into student values ("li","85","英语");

insert into student values ("xiong","65","英语");

insert into student values ("bao","60","英语");

insert into student values ("king","85","英语");

insert into student values ("ying","70","英语");

insert into student values ("hong","65","英语");

第一步:创建视图view2: 得到各科成绩分布的记录数目;并按照科目,记录数大小倒叙排列;

create view view2 as select dept,score,count(score) as countnum from student group by dept,score order by dept,countnum desc;

第二步:创建视图view3: 得到所有的科目列表;

create view view3 as select dept from student group by dept;

第三步:左连接查询:  得到各科成绩第一条记录数;

select view3.dept,view2.score,view2.countnum from view3 left join view2 on view3.dept=view2.dept group by view3.dept;

其中第二步和第三步可以合并优化

select * from view2 group by dept;可以直接得到最终结果;

或者是:

select dept,score,max(countnum) from view2 group by dept;

有一个问题,就是有某一科有两个成绩分布记录一样,这种情况;

select * from view2 where countnum in (select max(countnum) from view2 group by dept);

时间: 2024-10-11 04:12:49

sql从学生成绩表中查出各科成绩分布最多的记录的相关文章

FineUI之使用SQL脚本从数据库表中生成相应的输入控件

在WEB开发时,经常需要依据数据库表中的字段建立相应的输入控件,来获取输入的数据.每次都需要按字段来敲,显然太低效,而且容易出错.这里提供一个SQL脚本生成相应输入控件的方法. USE DBDemo DECLARE @TEMP_TABLE_NAME NVARCHAR(512) DECLARE @WIDTH NVARCHAR(50) SET @TEMP_TABLE_NAME='Stuff' SET @WIDTH='200' SELECT '<f:'+TOKEN+' runat="server

Sql从一张表中更改另一张表数据

语法: update table1 set table1.列=table2.列 from table2 where table2.列=table1.列update NFYSP.dbo.PATIENT     setPATIENT_ADDUSERID=OLD.PATIENT_ADDUSERID,PATIENT_UPDATEUSERID=OLD.PATIENT_UPDATEUSERID,PATIENT_UPDATEUSERNAME=OLD.PATIENT_UPDATEUSERNAME,PATIENT

Sql Server删除数据表中重复记录 三种方法

本文介绍了Sql Server数据库中删除数据表中重复记录的方法. [项目]数据库中users表,包含u_name,u_pwd两个字段,其中u_name存在重复项,现在要实现把重复的项删除![分析]1.生成一张临时表new_users,表结构与users表一样:2.对users表按id做一个循环,每从users表中读出一个条记录,判断new_users中是否存在有相同的u_name,如果没有,则把它插入新表:如果已经有了相同的项,则忽略此条记录:3.把users表改为其它的名称,把new_use

【半转贴】解决SQL SERVER 2008数据库表中修改字段后不能保存

SQL SERVER 2008数据库表中修改字段后不能保存,这种情况将阻止保存要求重新创建表的更改一项的钩钩去掉就OK了 找到工具>选项>Designers>表设计器和数据库设计器 然后将“阻止保存要求重新创建表的更改” 的这一项的钩钩去掉就OK了 图片来自:http://www.jb51.net/article/42727.htm 刚好碰到这个问题,用的就是上面的方法解决的 [半转贴]解决SQL SERVER 2008数据库表中修改字段后不能保存

一条SQL语句查询两表中两个字段

首先描述问题,student表中有字段startID,endID.garde表中的ID需要对应student表中的startID或者student表中的endID才能查出grade表中的name字段,这时候问题就来了,如果需要一条sql一句同时查出garde表中的两条数据怎么办?(两表的关联字段为 SID) sql="select b.name,c.name as name2 from student a,garde b,grade c where a.SID=b.SID and a.SID=c

sql server数据库的表中修改一个表的字段的数据类型后,不能保存

一个表中的一个字段 student(sno, sname, age) sname 类型 nchar(10) 修改成int 保存时报错. 这个是SQL SERVER自身默认设置的问题,它默认为不能修改类型. 只需要在"tool->option->Designer ->Table and Database designers 中 去掉prvent saving changes that require table re-created."就可以了, 欧克了,在保存刷新.

我们在删除SQL Sever某个数据库表中数据的时候,希望ID重新从1开始,而不是紧跟着最后一个ID开始需要的命令

一.如果数据重要,请先备份数据 二.删除表中数据 SQL: Delete From ('表名')  如:Delete From abcd 三.执行新语句 SQL: dbcc checkident('表名',reseed,0) 如:dbcc checkident('abcd',reseed,0) 注: { DBCC CHECKIDENT ('table_name', RESEED, new_reseed_value) 检查指定表的当前标识值,如有必要,还对标识值进行更正. } 这样操作后,新插入的

SQL笔记----在一个关系表中操作列

使用alter关键字,可以为一个表添加新的列. 比如: 给Persons的表中添加一列,名字为Birthday,类型是date. ALTER TABLE Persons ADD Birthday date 使用alter的格式为: ALTER TABLE table_name ADD column_name datatype 在一个表中删除一列的操作为: ALTER TABLE table_name DROP COLUMN column_name 改变列的属性: ALTER TABLE tabl

SQL Server批量向表中插入多行数据语句

因自己学习测试需要,需要两个有大量不重复行的表,表中行数越多越好.手动编写SQL语句,通过循环,批量向表中插入数据,考虑到避免一致问题,设置奇偶行不同.个人水平有限,如有错误,还望指正. 语句如下: 1 --批量向表中插入大量数据语句(奇偶不同) 2 3 --判断测试表是否存在,存在则先删除再创建 4 if exists(select 1 from sysobjects where xtype='u' and name='table_test' ) 5 drop table table_test