假设您有一个包含StuId,StuName,Subject,Grade的表。您需要提供子查询以返回荣誉学生名单(前10%),按其平均成绩排序。
例如,如果我有10名学生的平均成绩是100,90,80,...... 10。 需要输出平均值为100的第一个学生姓名。仅输出一个学生成绩。所以我不能使用限制10我正在使用mysql 5.1。
这是我的问题:
SELECT Stuname, TOP 10 Avg(Grade) as GPA
FROM Table
GROUP BY Stuid
ORDER BY GPA
由于TOP 10
,查询不正确。检查MYSQL 5.1参考,它不支持前10名。
根据评论,我不认为可以使用一个查询来解决,所以我想出了一个方法:
F(conn){
Statement stmt;
int top10percnet = 0;
try{
stmt = conn.createStatement;
String query = "select CEIL(count(stuname)*10/100) as 10percent from grades";
ResultSet rs = stmt.execute(query);
while(rs.next()){
top10percent = rs.getString("10percent");
}
query = "select stuname, avg(grade) as average from grades group by stuname order
by average desc limit " + Integer.toString(top10percnet);
rs=stmt.execute(query);
while(rs.next()){
...// output result
}
}
catch(SQLException e){
}
}
答案 0 :(得分:3)
听起来你想要加入一个HAVING
条款来限制那些得分高于90的平均成绩的人。
尝试
SELECT Stuid, Stuname, AVG(Grade) AS GPA FROM Table
GROUP BY Stuid, Stuname
HAVING AVG(GRADE) > 90
ORDER BY GPA DESC -- If you want highest-to-lowest. Thanks Bohemian
答案 1 :(得分:2)
使用LIMIT
和DESC
订单(即从最高到最低):
select Stuname, Avg(Grade) as GPA
from Table
group by Stuid
order by 1 DESC -- Add DESC
LIMIT 10 -- Add LIMIT
答案 2 :(得分:2)
TOP
是SQL Server 2000+特有的; MySQL使用LIMIT
语法 - 既不是ANSI,也是最近只有FETCH FIRST 10 ROWS ONLY
制作的ANSI(DB2是我所知道的唯一支持它的数据库)。
因为您将问题标记为“mysql”:
SELECT t.stuname,
AVG(t.grade) AS grade_avg
FROM TABLE t
GROUP BY t.stuname
ORDER BY grade_avg DESC
LIMIT 10
对于SQL Server 2000+,查询将是:
SELECT TOP 10
t.stuname,
AVG(t.grade) AS grade_avg
FROM TABLE t
GROUP BY t.stuname
ORDER BY grade_avg DESC
TOP
始终位于SELECT
子句中的列之前。从SQL Server 2005+开始,您可以在顶部值周围使用括号来允许您使用变量:
DECLARE @int_var INT
SET @int_var = 10
SELECT TOP (@int_var)
t.stuname,
AVG(t.grade) AS grade_avg
FROM TABLE t
GROUP BY t.stuname
ORDER BY grade_avg DESC
这允许您动态设置TOP
,而无需动态SQL。
答案 3 :(得分:2)
count = select CEIL(count(Stuname)*10/100) from table_name;
select Stuname from table_name ORDER BY GPA DESC limit count;
第一个查询将返回10%的students.CEIL用于将其转换为整数。 第二个查询是检索数据。 从第一个查询计算的计数被设置为第二个查询的限制。
答案 4 :(得分:1)
您是否尝试过使用LIMIT?
e.g。
select Stuname, Avg(Grade) as GPA from Table group by Stuid order by GPA limit 10