SQL语句问题.高手快来~!~

marydan 2006-08-10 09:21:02
STUDENT 字段 STUDENTID(学号)(主键) NAME(姓名) SEX(性别) BIRTHDAY(出生日期)

CLASS 字段 CLASSID(课程编号)(主键) CALSSNAME(课程名)

STORE 字段 STUDENTID(学号)(主键) CLASSID(课程编号)(主键) STORE(成绩)

STUDENT 表表示的是学生的基本信息
CLASS 表表示的是课程信息,这个表中的内容我已经固定下来了,不允许大家修改
STORE 表表示的是成绩表

要求:选出所有学生的成绩,要求查询出 学号、姓名、所有五门课程的成绩(这五门课是可选,不一定所有的人都选了这五门课)、这五门课程的学分评定(60分以下0学分,60-69分1学分,70-79分2学分,80-89分3学分,90以上4学分)、和总学分。



希望大家指教,顺便告诉如何给分解帖

...全文
236 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw_delphi 2006-08-11
  • 打赏
  • 举报
回复
select s.studentid,s.name,p.store,p.classid,p.calssname,
decode(Trunc(p.store/10, 0),10,4,9,4,8,3,7,2,6,1,0) xf,
sum(decode(Trunc(p.store/10, 0),10,4,9,4,8,3,7,2,6,1,0)) over (PARTITION BY p.studentid) zf
from student s,(select k.*,c.calssnamefrom store k,class c where c.classid=k.classid) p
where s.studentid=p.studentid(+)
marydan 2006-08-11
  • 打赏
  • 举报
回复
如果没有课程名的话,外连接就能好用.但是加上课程名后,就运行不出来,.该怎么解决呀!!!
marydan 2006-08-11
  • 打赏
  • 举报
回复
试过了
不好用
不知道怎么回事
能帮着解决吗>>>???
外连接我知道!!!!
谢谢了
gw_delphi 2006-08-11
  • 打赏
  • 举报
回复
select s.studentid,s.name,k.store,c.calssname,
decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0) xf,
sum(decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0)) over (PARTITION BY s.studentid) zf
from student s,store k,class c
where s.studentid=k.studentid(+) and c.classid=k.classid
用左连接试下看看


Oracle的左连接和右连接
在Oracle PL-SQL中,左连接和右连接以如下方式来实现

查看如下语句:
SELECT emp_name, dept_name
FORM Employee, Department
WHERE Employee.emp_deptid(+) = Department.deptid此SQL文使用了右连接,即“(+)”所在位置的另一侧为连接的方向,右连接说明等号右侧的所有记录均会被显示,无论其在左侧是否得到匹配,也就是说上例中无论会不会出现某个部门没有一个员工的情况,这个部门的名字都会在查询结果中出现。

反之:
SELECT emp_name, dept_name
FORM Employee, Department
WHERE Employee.emp_deptid = Department.deptid(+)则是左连接,无论这个员工有没有一个能在Department表中得到匹配的部门号,这个员工的记录都会被显示
marydan 2006-08-11
  • 打赏
  • 举报
回复
从容大哥,你的个答案不全面.
如果学生没有课程的话
姓名就显示不出来

该怎么改呀`!!
龙翔飞雪 2006-08-10
  • 打赏
  • 举报
回复
楼主在考试???
自己装个数据库玩几下就会了呀
gw_delphi 2006-08-10
  • 打赏
  • 举报
回复
刚刚写错了
select s.studentid 学号,s.name 姓名,k.store 分数,c.calssname 课程名,
decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0) 学分,
sum(store) over (PARTITION BY s.studentid) 总分
from student s,store k,class c
where s.studentid=k.studentid and c.classid=k.classid
gw_delphi 2006-08-10
  • 打赏
  • 举报
回复
select s.studentid 学号,s.name 姓名,k.store 分数,c.calssname 课程名,
decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0) 学分,
sum(store) over (PARTITION BY s.studentid) 总分
(store-50)%10 学分 from student s,store k,class c
where s.studentid=k.studentid and c.classid=k.classid
marydan 2006-08-10
  • 打赏
  • 举报
回复
我按了
也输入密码了
可是不知道为什么就是不能解贴.
今天的问题怎么解决呀..
dd_zhouqian 2006-08-10
  • 打赏
  • 举报
回复
A.按学号进行分组,然后case一下就可以了
B.结贴,按“管理“就知道了
gw_delphi 2006-08-10
  • 打赏
  • 举报
回复
我说兄弟.我回答你N多问题了.你也不给分 汗啊
marydan 2006-08-10
  • 打赏
  • 举报
回复
在STORE表中,如果一个学生没有选这门课程,就没有对应的记录。
marydan 2006-08-10
  • 打赏
  • 举报
回复
SELECT
S.ID 學号,
S.NAME 姓名,
DECODE(S.CLASSNAME,'ENGLISH','ENGLISH') 課程1,
DECODE(S.CLASSNAME,'ENGLISH',S.STORE) 課程1學分,
DECODE(S.CLASSNAME,'MATH','MATH') 課程2,
DECODE(S.CLASSNAME,'MATH',S.STORE) 課程2學分,
DECODE(S.CLASSNAME,'OPERATION','OPERATION') 課程3,
DECODE(S.CLASSNAME,'OPERATION',S.STORE) 課程3學分,
DECODE(S.CLASSNAME,'CHINESE','CHINESE') 課程4,
DECODE(S.CLASSNAME,'CHINESE',S.STORE) 課程4學分,
DECODE(S.CLASSNAME,'DATABASE','DATABASE') 課程5,
DECODE(S.CLASSNAME,'DATABASE',S.STORE) 課程5學分
FROM
(SELECT STUDENT.NAME,(STUDENT.STUDENTID)AS ID,DECODE(TRUNC(STORE.STORE/10),10,4,9,4,8,3,7,2,6,1,0) STORE,CLASS.CLASSNAME
FROM STUDENT,STORE,CLASS
WHERE STUDENT.STUDENTID=STORE.STUDENTID AND CLASS.CLASSID=STORE.CLASSID) S


该怎么改
marydan 2006-08-10
  • 打赏
  • 举报
回复
学习中
挺不好意思的
分也没有给上.
gw_delphi 2006-08-10
  • 打赏
  • 举报
回复
原来是求总学分,再改下
select s.studentid,s.name,k.store,c.calssname,
decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0) xf,
sum(decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0)) over (PARTITION BY s.studentid) zf
from student s,store k,class c
where s.studentid=k.studentid and c.classid=k.classid

over 是Oracle的分析函数
sum(decode(Trunc(store/10, 0),10,4,9,4,8,3,7,2,6,1,0)) over (PARTITION BY s.studentid) 表示按照学号对学分进行分区统计得到总学分
例如总学分查询结果如下:
学号 学分 总学分
1 1 3
1 2 3
2 2 5
2 3 5

附录:
over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数
over(partition by deptno)按照部门分区
over(order by salary range between 50 preceding and 150
following)
每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150
over(order by salary rows between 50 preceding and 150
following)
每行对应的数据窗口是之前50行,之后150行
over(order by salary rows between unbounded preceding
and unbounded following)
每行对应的数据窗口是从第一行到最后一行,等效:
over(order by salary range between unbounded preceding
and unbounded following)
marydan 2006-08-10
  • 打赏
  • 举报
回复
为什么不能给分呢
我去管理那了
也出来确认对话框了
可是就是没有给分
出现这个
http://community.csdn.net/expert/GiveTip.asp
我看不懂内容我是日文系统
`1`1`
从容,你的分我会给的 不好意思 ~!!! 还没弄明白
不行去网吧弄
marydan 2006-08-10
  • 打赏
  • 举报
回复
over (PARTITION BY s.studentid) 是什么意思 能给我讲讲吗~!!~
这就去解贴

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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