求一简单oracle统计sql,多谢。

xieyunchao 2009-10-27 10:08:05
现一统计oracle sql希望大家帮我写一下,多谢。
学生表:t_student
字段:t_id 主键
tname 姓名
t_class 班级
t_score 分数
t_weight 体重

上课表: t_work
字段:w_id 主键
t_id 学生表主键,作为上课表的外键
w_work_time 上课时间
is_late 是否迟到
w_score 分数
w_weight 体重
现需一条sql,要求:

按班级统计上课次数为1次的学生占该班总人数比例、上课次数为2次的学生占该班总人数比例、上课次数为3次的学生占该班总人数比例、分数1次及格人数在该班级的比例、分数2次及格人数在该班级的比例、体重曾经等于50kg的人数在该班级的比例

注:1、上课次数为1次的学生占该班总人数比例、上课次数为2次的学生占该班总人数比例、上课次数为3次的学生占该班总人数比例、分数1次及格人数在该班级的比例、分数2次及格人数在该班级的比例 的分子分母都显示实际数字,而不显示小数。体重曾经等于50kg的人数在该班级的比例分别以实际的分子分母和小树的形式显示。
2、有些字段如分数、体重,学生表和上课表中都有,统计的时候需要注意两个表的数据都需要考虑,。
...全文
347 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Phoenix_99 2009-10-28
  • 打赏
  • 举报
回复
写的有些不太明确
whj66653400 2009-10-28
  • 打赏
  • 举报
回复
用:
case 条件 when 成立1 then 值1
when 成立2 then 值2
when 成立3 then 值3
...........
else 值n
end
BrokenSymmetry 2009-10-27
  • 打赏
  • 举报
回复
如果算学生表成绩的话

SELECT t_class,
SUM(CASE WHEN work_cnt = 1 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_cnt = 2 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_cnt = 3 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN w_score + t_score = 1 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN w_score + t_score = 2 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_weight > 0 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_weight > 0 THEN 1 ELSE 0 END)/COUNT()
FROM (SELECT a.t_id, a.t_class,
SUM(CASE WHEN b.w_id IS NOT NULL THEN 1 ELSE 0 END) AS work_cnt,
SUM(CASE WHEN b.w_score >= 60 THEN 1 ELSE 0 END) AS w_score,
CASE WHEN a.t_score >= 60 THEN 1 ELSE 0 END AS t_score,
SUM(CASE WHEN a.t_weight = 50 OR b.t_weight = 50 THEN 1 ELSE 0 END) AS work_weight
FROM t_student a, t_work b
WHERE a.t_id = b.t_id(+)
GROUP BY a.t_id, a.t_class, a.t_score) c
GROUP BY t_class
BrokenSymmetry 2009-10-27
  • 打赏
  • 举报
回复
SELECT t_class,
SUM(CASE WHEN work_cnt = 1 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_cnt = 2 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_cnt = 3 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_score = 1 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_score = 2 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_weight > 0 THEN 1 ELSE 0 END)||'/'||COUNT(),
SUM(CASE WHEN work_weight > 0 THEN 1 ELSE 0 END)/COUNT()
FROM (SELECT a.t_id, a.t_class,
SUM(CASE WHEN b.w_id IS NOT NULL THEN 1 ELSE 0 END) AS work_cnt,
SUM(CASE WHEN b.w_score >= 60 THEN 1 ELSE 0 END) AS work_score,
SUM(CASE WHEN a.t_weight = 50 OR b.t_weight = 50 THEN 1 ELSE 0 END) AS work_weight
FROM t_student a, t_work b
WHERE a.t_id = b.t_id(+)
GROUP BY a.t_id, a.t_class) c
GROUP BY t_class

不知道对不对
小灰狼W 2009-10-27
  • 打赏
  • 举报
回复
上课表这么会有分数和体重
两表的这两个字段值会不会出现不符的情况
怎么处理

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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