设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 1730|回复: 5
打印 上一主题 下一主题

[查询] 求助:学生成绩查询的SQL部分语句不能在ACCESS2003内运行

[复制链接]
跳转到指定楼层
1#
发表于 2011-8-25 17:02:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


在学习ACCESS,找了一个“学生成绩查询”的SQL语句,但部分语句不能在ACCESS2003内运行,
请高手帮助指导一下,把原答案的语句改写成ACCESS2003的语句
非常感激。

数据库源文件里有一个“明细说明”表,可查看详细信息

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 分享淘帖 订阅订阅
2#
发表于 2011-8-26 00:18:29 | 只看该作者
建议别用SQL的语法套到Access里,除了部分语法不一样之外,其对数据的处理方式也是不一样的。例如SQL里常用的是子查询和嵌套查询,而子查询在Access里执行效率可能很低(例如In Select 类型),而用得更多是左联接、右联接等等。
第一个可以简化为:SELECT stuscore.name, Sum(stuscore.score) AS 总分 FROM stuscore GROUP BY stuscore.name ORDER BY Sum(stuscore.score) DESC;
第二个类似,增加个stuid字段而已。
第三个:SELECT TOP 2 stuscore.stuid, stuscore.name, stuscore.subject, stuscore.score FROM stuscore GROUP BY stuscore.stuid, stuscore.name, stuscore.subject, stuscore.score ORDER BY stuscore.score DESC;
第四个:SELECT DISTINCT stuscore.name, Avg(stuscore.score) AS score之平均值 FROM stuscore GROUP BY stuscore.name;
第五个:SELECT DISTINCT stuscore.subject, DMax("Score","stuscore","subject='" & [subject] & "'") AS 成绩,DLookUp("name","stuscore","subject='" & [subject] & "' and score=" & [成绩]) AS nameFROM stuscore;
第六个:SELECT TOP 3 stuscore.subject, DMax("score","stuscore","subject='" & [subject] & "'") AS score,DLookUp("name","stuscore","subject='" & [subject] & "' and score=" & [score]) AS name FROM stuscore;
第七个:TRANSFORM Sum(stuscore.score) AS score SELECT stuscore.stuid AS 学号, stuscore.name AS 姓名, DSum("Score","Stuscore","name='" & [name] &"'")/DCount("Score","Stuscore","name='" & [name] & "'") AS 平均分, Sum(stuscore.score) AS 总分 FROM stuscore GROUP BY stuscore.stuid, stuscore.name, DSum("Score","Stuscore","name='" & [name] & "'")/DCount("Score","Stuscore","name='" & [name] & "'") PIVOT stuscore.subject;
第八个不变。
第九个:建议先建立一个含有自动编号的空白表,按降序将数据追加进去,自动编号即为排名。即便有时候可能编号有变化,用Dcount也可以很轻易得到排名。
第十个:建立第一个查询,用降序Top3获得前三名学生(科目的条件为“数学”),再以此为数据源升序获取Top2,即为第二、三名。
第十一个:参考第九个。
第十二个:用IIF来写自定义字段,例如:SELECT stuscore.subject, Sum(IIf([Score]<60,1,0)) AS 不及格人数, Sum(IIf([Score]>=60 And [Score]<=80,1,0)) AS 良好, Sum(IIf([Score]>80 And [Score]<100,1,0)) AS 优秀 FROM stuscore GROUP BY stuscore.subject, stuscore.score;
第十三个:不好意思。这个不是查询,VBA代码很容易实现。但鉴于你的理解能力,暂时先不说了。
3#
 楼主| 发表于 2011-8-26 11:05:23 | 只看该作者
非常感谢,要好好学习一下
4#
 楼主| 发表于 2011-8-26 12:52:56 | 只看该作者
本帖最后由 lastmem 于 2011-8-26 12:53 编辑

第三个:SELECT TOP 2 stuscore.stuid, stuscore.name, stuscore.subject, stuscore.score FROM stuscore GROUP BY stuscore.stuid, stuscore.name, stuscore.subject, stuscore.score ORDER BY stuscore.score DESC;

如果李四的二门课程成绩都是90分,这样就会出错
如下语句可以达到目的,请老师指点
SELECT stuscore.stuid, stuscore.name, Max(stuscore.score) AS score之最大值, First(stuscore.subject) AS subject之第一条记录
FROM stuscore
GROUP BY stuscore.stuid, stuscore.name
ORDER BY Max(stuscore.score) DESC;

看了老师的回复,感觉主要是在于思路和对函数的了解太欠缺,
目前我还只停留在用设计视图来简单拖拉生成SQL语句的水平。
在工作中经常建立多个查询后,然后再把这多个查询联接后建立新查询,造成数据库里都是查询表
学习的目的是把有些查询做为子查询来放到最终结果里,减少查询表的个数
请老师多多指点一下,推荐一些帖子来让我学习。再次谢谢
5#
发表于 2011-8-27 09:11:19 | 只看该作者
我同样也不习惯用语句,太抽象了。只不过懒得上传附件所以就贴上语句罢了。在Access里,要学会思维的转换。SQL里一个语句可以完成的,Access里可能需要两个或多个查询,不要总是希望一步到位。因为子查询在Access里可能会导致运行效率的低下。
6#
发表于 2011-8-27 09:28:33 | 只看该作者
同样受教了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-9-27 06:13 , Processed in 0.117424 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表