SQL查询查找组长的出勤率应该大于avg。出席率 占HIS组所有成员的百分比

Posted

技术标签:

【中文标题】SQL查询查找组长的出勤率应该大于avg。出席率 占HIS组所有成员的百分比【英文标题】:SQL query to find The attendance % of the group leader should be greater than the avg. attendance % of all members of HIS group 【发布时间】:2019-01-23 04:51:04 【问题描述】:

在一个有 100 名学生的班级中,班主任希望创建一个 10 人的小组,每个小组有一位组长。根据学生姓名的字母顺序为学生分配卷号(1,2,3…,100)。 CT 采用一种简单的方法,根据他们的卷号创建 10 个组。他还随机分配了一个人作为组长——

G1 - 1 到 10 [组长 - 6]

G2 - 11 至 20 [组长 - 14]

G3 - 21 到 30 [组长 - 25]

等等……

编写一个 SQL 查询,根据资格标准将 CT 选出的组长分类为“合格”/“不合格” -

资格标准:组长的出席率应高于平均出席率。 HIS 小组所有成员的出席率。

数据存储在以下两个表中 -

需要输出:

【问题讨论】:

我的方法到目前为止 Q1。查询以创建组 对于标签组 SELECT CASE WHEN roll_number 请阅读并按照How to Ask、向下投票箭头鼠标悬停文本和点击谷歌搜索“stackexchange 作业”并采取行动。展示您尝试过的内容以及您可以做的相关部分。请通过帖子编辑而不是 cmets 进行澄清。请阅读minimal reproducible example 并采取行动。请use text, not images/links, for text (including code, tables & ERDs)。使用图片只是为了方便补充文本和/或无法在文本中给出的内容。 @rcs 请不要不恰当地内联链接。尽可能查看我上面关于使用文本的评论。要么用代码块格式的表格文本替换表的链接(如果问题应该给出minimal reproducible example,则应该同时是创建和初始化表的代码),或者更好的是,评论告诉发布者这样做。 PS 这应该被否决并关闭。 【参考方案1】:

“CT 采用一种简单的方法,根据他们的点名创建 10 个组。”

这就是问题所在。他应该把出席率最高的 10 个人选为小组组长。那么你评估“资格”的困难问题就定义为蒸发了。

但毫无疑问,这是功课,所以这里是策略:

1) 使用连接,得到一个四列表(roll_number student_attendance leader_roll_number leader_attendance) 2) 计算每组的 AVG(student_attendance) (GROUP BY leader_roll_number) 3) 将其与 leader_attendance 进行比较,并使用 CASE 表达式计算“合格”列的值

我不会用勺子喂你 SQL 本身。

【讨论】:

我想了很多,但感谢您的方法。我已经完成了连接部分。它是我无法理解的 AVG 声明。任何帮助将不胜感激!再次感谢 由于组列没有预定义 SELECT AVG(p) FROM input GROUP BY g 的工作原理如下:它将首先根据 g 的值“分区”您的输入 - 从而创建具有相同 g 值的“组” - 然后计算每组中 p 的平均值 - 结果表中每组只有一行【参考方案2】:

如果你需要查询,这里是:

select distinct aa.leader_roll_number, (min_roll_no||'-'||max_roll_no) as grp , bb.student_attendance as leader_attendance, 
          case when avg(aa.student_attendance) over (partition by aa.leader_roll_number) < bb.student_attendance then 'eligible' else 'not eligibe' end as eligibility from
      (
      select roll_number, student_attendance, leader_roll_number, min(roll_number) over (partition by leader_roll_number) as min_roll_no, max(roll_number) over (partition by leader_roll_number) as max_roll_no from
           (
            select a.*, b.leader_roll_number from student_attendance a
                      join group_leader_mapping b on a.roll_number=b.roll_number
          )
      ) aa
      join          
      (        
      select distinct leader_roll_number, student_attendance from group_leader_mapping a
                join student_attendance b on a.leader_roll_number=b.roll_number
      ) bb  on  aa.leader_roll_number=bb. leader_roll_number      
      order by 1

【讨论】:

请在发帖前查看文本的格式化版本。请编辑它以格式化代码块中的代码。请不要只是转储代码,解释为什么它回答了这个问题。 How to Answer 欢迎来到 ***!即使忽略格式,恐怕这也不是一个很好的答案。最好包含解释您的答案的作用以及为什么有效的信息,以便其他人可以从中学习,而不是仅仅给出答案。另外,请注意这是 2016 年发布的作业问题,OP 仍然关心的可能性非常低!

以上是关于SQL查询查找组长的出勤率应该大于avg。出席率 占HIS组所有成员的百分比的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB查询:如何查找嵌套对象中的字符串

查询平均成绩大于70分的学生学号和姓名。

sql:练习题2查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩

仓库设计:跟踪没有事件

SQL Server:查找大于 5 的最近连续记录

SQL查询学习