sql - 如何在单个 SQL 语句中两次使用 GROUP BY 语句?

标签 sql oracle

我有以下 SQL 查询:

SELECT CourseId, DateOfCourseCompletion, COUNT(DISTINCT EmployeeId) FROM tblTestsTakenByEmployee ttbe
    INNER JOIN tblCoursesTakenByEmployee ctbe USING (ctbe.EmployeeId)
    WHERE ctbe.HasCompletedCourse = 'Y'
    GROUP BY ctbe.CourseId, ctbe.DateOfCourseCompletion, ctbe.EmployeeId
    HAVING AVG(ttbe.GivenMark) > 50
    ORDER BY ctbe.CourseId, ctbe.DateOfCourseCompletion;
目前,这会查找在某个日期完成的类(class)的平均分数大于 50 的单个员工的平均分数,该分数是根据他们所做的各种测试计算得出的(一门类(class)可以有多个测试)。
但是,现在我想计算在同一日期完成同一类(class)且分数大于 50 的员工数量。我假设您不能再次使用 GROUP BY,因为该语句已用于将员工在给定类(class)中完成的所有测试组合在一起。如果不使用 GROUP BY 语句,我将如何按此分组?

最佳答案

使用子查询 - 外部查询方法,如下所示(未测试):

select courseid, dateofcoursecompletion, count(employeeid) as employee_count
from   (
         select courseid, dateofcoursecompletion, employeeid
         from   tblteststakenbyemployee ttbe
                inner join tblcoursestakenbyemployee ctbe using (employeeid)
         where  ctbe.hascompletedcourse = 'Y'
         group  by courseid, dateofcoursecompletion, employeeid
         having avg(givenmark) > 50
       )
group  by courseid, dateofcoursecompletion
order  by courseid, dateofcoursecompletion
;
请注意,您不需要 独特 在员 worker 数上。子查询中的聚合产生 (courseid, dateofcompletion, employeeid) 的不同三元组,所以在外部查询中,在每个组中由 (courseid, dateofcompletion)员工 ID 已经不同了。

关于sql - 如何在单个 SQL 语句中两次使用 GROUP BY 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65061772/

相关文章:

c# - SQL 表到 JSON 文件

java - ResultSet 没有从 Oracle DB 中获取所有数据

database - PL/SQL-甲骨文 : ORA-01843: not a valid month

php - PHP 和 Oracle 在企业环境中的配合程度如何?

linux - 甲骨文毫秒 : Avoid blank-padding in Embedded SQL

mysql - 它没有在查询中显示任何结果

mysql - SQL 存储例程

mysql - 为什么我在此连接表中收到错误?

mysql - MySQL 上的 sql 查询优化

oracle - where子句中的日期格式-Oracle