上个总是没说清楚,在这重新发一下,请原谅.背景:数据格式如 成绩表(全校各班级学生成绩).
问题:想按平均成绩由高到低排序,显示平均成绩在本班前60%的学生名单(显示结果如:学号 班级 平均分),请前辈指点下!小弟先感谢了!成绩表
学号 班级 课程 成绩
20090001 一班 课程一 80
20090001 一班 课程二 50
20090001 一班 课程三 40
20090002 一班 课程一 80
20090002 一班 课程二 70
20090002 一班 课程三 80
20090003 一班 课程四 90
20090003 一班 课程五 40
20090003 一班 课程六 60
20090004 二班 课程一 50
20090004 二班 课程二 50
20090004 二班 课程三 70
20090005 二班 课程一 30
20090005 二班 课程二 70
20090005 二班 课程三 60
问题:想按平均成绩由高到低排序,显示平均成绩在本班前60%的学生名单(显示结果如:学号 班级 平均分),请前辈指点下!小弟先感谢了!成绩表
学号 班级 课程 成绩
20090001 一班 课程一 80
20090001 一班 课程二 50
20090001 一班 课程三 40
20090002 一班 课程一 80
20090002 一班 课程二 70
20090002 一班 课程三 80
20090003 一班 课程四 90
20090003 一班 课程五 40
20090003 一班 课程六 60
20090004 二班 课程一 50
20090004 二班 课程二 50
20090004 二班 课程三 70
20090005 二班 课程一 30
20090005 二班 课程二 70
20090005 二班 课程三 60
declare @成绩表 table (学号 int,班级 varchar(4),课程 varchar(6),成绩 int)
insert into @成绩表
select 20090001,'一班','课程一',80 union all
select 20090001,'一班','课程二',50 union all
select 20090001,'一班','课程三',40 union all
select 20090002,'一班','课程一',80 union all
select 20090002,'一班','课程二',70 union all
select 20090002,'一班','课程三',80 union all
select 20090003,'一班','课程四',90 union all
select 20090003,'一班','课程五',40 union all
select 20090003,'一班','课程六',60 union all
select 20090004,'二班','课程一',50 union all
select 20090004,'二班','课程二',50 union all
select 20090004,'二班','课程三',70 union all
select 20090005,'二班','课程一',30 union all
select 20090005,'二班','课程二',70 union all
select 20090005,'二班','课程三',60
select 学号,班级,avg(成绩) as 平均分 from @成绩表 group by 班级,学号 order by avg(成绩) desc
from (select 学号,班级,avg(成绩) as 平均分
from 成绩表 group by 学号,班级
) as t
order by 平均分 desc
declare @成绩表 table (学号 int,班级 varchar(4),课程 varchar(6),成绩 int)
insert into @成绩表
select 20090001,'一班','课程一',80 union all
select 20090001,'一班','课程二',50 union all
select 20090001,'一班','课程三',40 union all
select 20090002,'一班','课程一',80 union all
select 20090002,'一班','课程二',70 union all
select 20090002,'一班','课程三',80 union all
select 20090003,'一班','课程四',90 union all
select 20090003,'一班','课程五',40 union all
select 20090003,'一班','课程六',60 union all
select 20090004,'二班','课程一',50 union all
select 20090004,'二班','课程二',50 union all
select 20090004,'二班','课程三',70 union all
select 20090005,'二班','课程一',30 union all
select 20090005,'二班','课程二',70 union all
select 20090005,'二班','课程三',60
select top 60 percent 学号,班级,avg(成绩) as 平均分 from @成绩表 group by 班级,学号 order by avg(成绩) desc
/*
学号 班级 平均分
----------- ---- -----------
20090002 一班 76
20090003 一班 63
20090004 二班 56
*/
insert t
select 20090001,'计算机','英语',60 union all
select 20090001,'计算机','体育',70 union all
select 20090001,'计算机','语文',80 union all
select 20090002,'计算机','英语',60 union all
select 20090002,'计算机','体育',75 union all
select 20090002,'计算机','语文',80 Union all
select 20090003,'计算机','英语',69 union all
select 20090003,'计算机','体育',78 union all
select 20090003,'计算机','语文',80 union all
select 20090004,'计算机','英语',64 union all
select 20090004,'计算机','体育',75 union all
select 20090004,'计算机','语文',82 Union all
select 20090005,'计算机','英语',60 union all
select 20090005,'计算机','体育',71 union all
select 20090005,'计算机','语文',80 union all
select 20090011,'会计','英语',60 union all
select 20090011,'会计','体育',75 union all
select 20090011,'会计','语文',80 Union all
select 20090012,'会计','英语',61 union all
select 20090012,'会计','体育',75 union all
select 20090012,'会计','语文',83 Union all
select 20090013,'会计','英语',60 union all
select 20090013,'会计','体育',74 union all
select 20090013,'会计','语文',86 Union all
select 20090014,'会计','英语',61 union all
select 20090014,'会计','体育',73 union all
select 20090014,'会计','语文',84 Union all
select 20090015,'会计','英语',63 union all
select 20090015,'会计','体育',75 union all
select 20090015,'会计','语文',85
select distinct a.学号
from t a,
(select top 60 percent 学号,avg(成绩) as av from t group by 班级,学号 order by av desc ) b
where a.学号=b.学号
/***********
20090003
20090004
20090012
20090013
20090014
20090015***********************/
insert into @成绩表
select 20090001,'一班','课程一',80 union all
select 20090001,'一班','课程二',50 union all
select 20090001,'一班','课程三',40 union all
select 20090002,'一班','课程一',80 union all
select 20090002,'一班','课程二',70 union all
select 20090002,'一班','课程三',80 union all
select 20090003,'一班','课程四',90 union all
select 20090003,'一班','课程五',40 union all
select 20090003,'一班','课程六',60 union all
select 20090004,'二班','课程一',50 union all
select 20090004,'二班','课程二',50 union all
select 20090004,'二班','课程三',70 union all
select 20090005,'二班','课程一',30 union all
select 20090005,'二班','课程二',70 union all
select 20090005,'二班','课程三',60
select *
from (select 学号,班级,avg(成绩) as 平均分
from @成绩表 group by 学号,班级
) as t
where 学号 in (
select top 60 PERCENT 学号
from (select 学号,班级,avg(成绩) as 平均分
from @成绩表 group by 学号,班级
) as t1
where 班级 = t.班级
)
order by 平均分 desc--结果
学号 班级 平均分
----------- ---- -----------
20090002 一班 76
20090001 一班 56
20090004 二班 56
20090005 二班 53(4 行受影响)
declare @成绩表 table (学号 int,班级 varchar(4),课程 varchar(6),成绩 int)
insert into @成绩表
select 20090001,'一班','课程一',80 union all
select 20090001,'一班','课程二',50 union all
select 20090001,'一班','课程三',40 union all
select 20090002,'一班','课程一',80 union all
select 20090002,'一班','课程二',70 union all
select 20090002,'一班','课程三',80 union all
select 20090003,'一班','课程四',90 union all
select 20090003,'一班','课程五',40 union all
select 20090003,'一班','课程六',60 union all
select 20090004,'二班','课程一',50 union all
select 20090004,'二班','课程二',50 union all
select 20090004,'二班','课程三',70 union all
select 20090005,'二班','课程一',30 union all
select 20090005,'二班','课程二',70 union all
select 20090005,'二班','课程三',60
select top 60 percent 学号,班级,avg(成绩) as 平均分 from @成绩表 group by 班级,学号 order by avg(成绩) desc
/*
20090002 一班 76
20090003 一班 63
20090004 二班 56
*/
select 20090001,'一班','课程一', 80 union all
select 20090001,'一班','课程二', 50 union all
select 20090001,'一班','课程三', 40 union all
select 20090002,'一班','课程一', 80 union all
select 20090002,'一班','课程二', 70 union all
select 20090002,'一班','课程三', 80 union all
select 20090003,'一班','课程四', 90 union all
select 20090003,'一班','课程五', 40 union all
select 20090003,'一班','课程六', 60 union all
select 20090004,'二班','课程一', 50 union all
select 20090004,'二班','课程二', 50 union all
select 20090004,'二班','课程三', 70 union all
select 20090005,'二班','课程一', 30 union all
select 20090005,'二班','课程二', 70 union all
select 20090005,'二班','课程三', 60
select top 60 percent 班级,学号, 平均分 from
(select distinct 班级,学号 ,平均分=(select avg(成绩) from @t where 班级=a.班级 and 学号=a.学号) from @t a) m
order by 平均分 desc/*班级 学号 平均分
-------------------- ----------- -----------
一班 20090002 76
一班 20090003 63
二班 20090004 56(3 行受影响)*/
from (
select 班级,学号, row_number() over(partition by 班级,学号 order by 平均分 desc) rn
from (
select 班级,学号,avg(成绩) 平均分
from 成绩表
group by 班级,学号
) a
) b,(select 班级,count(*)*0.6 rs
from 成绩表
group by 班级) c
where b.班级 = c.班级
and b.rn < c.rs
order by rn
--课程内容:关于TOP的使用方法
--讲师讲解:高建刚
--示例日期:2009-5-10
--****************************
--创建测试环境
CREATE TABLE TAB1(ID INT,RQ DATETIME)
--插入测试数据
DECLARE @int INT
SET @int=1
WHILE @int<100
BEGIN
INSERT TAB1
SELECT @int,GETDATE()
SET @int=@int+1
END
--查看测试表结果
--基础的TOP使用
SELECT TOP (10) ID,RQ
FROM TAB1
ORDER BY ID
--TOP PERCENT的使用
SELECT TOP (3) PERCENT ID
FROM TAB1
--TOP中使用WITH TIES
--插入重复数据
INSERT TAB1
SELECT '9',GETDATE()
SELECT TOP 10 WITH TIES *
FROM TAB1
ORDER BY ID
--使用变量(2005新特性)
declare @int int
set @int=9
select top (@int) *
from TAB1
--与 INSERT、UPDATE 或 DELETE 一起使用的 TOP 表达式中被引用行将不按任何顺序排列。
--TOP n 随机返回 n 行。
CREATE TABLE TAB2(ID INT)
INSERT TOP (2) INTO TAB2
SELECT ID
FROM TAB1
ORDER BY ID--ORDER BY 将失去作用
--检测结果
SELECT * FROM TAB2
--插入排序的数据时应该使用以下语句
INSERT INTO TAB2
SELECT TOP (2) ID
FROM TAB1
ORDER BY ID
--删除测试数据
TRUNCATE TABLE TAB1
TRUNCATE TABLE TAB2
--删除测试表
DROP TABLE TAB1
DROP TABLE TAB2--注意的问题:
--1.使用WITH TIES时必须含有ORDER BY子句
--2.查询中的 TOP 表达式不影响由于触发器被激发而执行的语句
IF OBJECT_ID('成绩表') IS NOT NULL DROP TABLE [成绩表]
CREATE TABLE [成绩表] (学号 VARCHAR(15),班级 VARCHAR(20),课程 VARCHAR(10),成绩 float)
INSERT INTO [成绩表]
SELECT '20090001','一班','课程一',80 UNION ALL
SELECT '20090001','一班','课程二',50 UNION ALL
SELECT '20090001','一班','课程三',40 UNION ALL
SELECT '20090002','一班','课程一',80 UNION ALL
SELECT '20090002','一班','课程二',70 UNION ALL
SELECT '20090002','一班','课程三',80 UNION ALL
SELECT '20090003','一班','课程四',90 UNION ALL
SELECT '20090003','一班','课程五',40 UNION ALL
SELECT '20090003','一班','课程六',60 UNION ALL
SELECT '20090004','二班','课程一',50 UNION ALL
SELECT '20090004','二班','课程二',50 UNION ALL
SELECT '20090004','二班','课程三',70 UNION ALL
SELECT '20090005','二班','课程一',30 UNION ALL
SELECT '20090005','二班','课程二',70 UNION ALL
SELECT '20090005','二班','课程三',60
go
--SQL语句
select top 60 percent 学号,班级,平均分
from (select DISTINCT(a.学号),a.班级,b.平均分 from 成绩表 a,(select 学号,avg(成绩)平均分 from 成绩表 group by 学号) b
where a.学号=b.学号 ) temp order by 平均分 desc/*学号 班级 平均分
-------------------- ----------- -----------
20090002 一班 76.6666666666667
20090003 一班 63.33333333333333
20090004 二班 56.6666666666667(3 行受影响)*/
declare @成绩表 table (学号 int,班级 varchar(4),课程 varchar(6),成绩 int)
insert into @成绩表
select 20090001,'一班','课程一',80 union all
select 20090001,'一班','课程二',50 union all
select 20090001,'一班','课程三',40 union all
select 20090002,'一班','课程一',80 union all
select 20090002,'一班','课程二',70 union all
select 20090002,'一班','课程三',80 union all
select 20090003,'一班','课程四',90 union all
select 20090003,'一班','课程五',40 union all
select 20090003,'一班','课程六',60 union all
select 20090004,'二班','课程一',50 union all
select 20090004,'二班','课程二',50 union all
select 20090004,'二班','课程三',70 union all
select 20090005,'二班','课程一',30 union all
select 20090005,'二班','课程二',70 union all
select 20090005,'二班','课程三',60
--結果
select top 60 percent *
from (select 班级,学号,AVG(成绩) as 平均成績 from @成绩表 group by 班级,学号) t1
order by 平均成績 desc
declare @tb table (学号 int,班级 varchar(4),课程 varchar(6),成绩 int)
insert into @tb
select 20090001,'一班','课程一',80 union all
select 20090001,'一班','课程二',50 union all
select 20090001,'一班','课程三',40 union all
select 20090002,'一班','课程一',80 union all
select 20090002,'一班','课程二',70 union all
select 20090002,'一班','课程三',80 union all
select 20090003,'一班','课程四',90 union all
select 20090003,'一班','课程五',40 union all
select 20090003,'一班','课程六',60 union all
select 20090004,'二班','课程一',50 union all
select 20090004,'二班','课程二',50 union all
select 20090004,'二班','课程三',70 union all
select 20090005,'二班','课程一',30 union all
select 20090005,'二班','课程二',70 union all
select 20090005,'二班','课程三',60select top 60 percent 学号 , 班级 ,avg(成绩)as 平均分 from @tb group by 学号,班级 order by 平均分 desc
学号 班级 平均分
----------- ---- -----------
20090002 一班 76
20090003 一班 63
20090004 二班 56(所影响的行数为 3 行)
select top 60 PERCENT * from (select 学号,班级,avg(成绩) as 平均分 from 成绩表 group by 学号,班级 ) as t order by 平均分 desc