【问题标题】:How to use the GROUP BY statement twice in a single SQL statement?如何在一条 SQL 语句中使用两次 GROUP BY 语句?
【发布时间】:2020-11-30 03:31:10
【问题描述】:

我有以下 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;

目前,这会查找在某个日期完成的课程的平均分数大于 50 的单个员工的平均分数,该分数是根据他们完成的各种测试计算得出的(一个课程可以有多个测试)。

但是,现在我想计算在同一日期完成同一课程的分数大于 50 的员工人数。我假设您不能再次使用 GROUP BY,因为该语句已经用于将员工在给定课程中完成的所有测试组合在一起。如果不使用 GROUP BY 语句,我将如何按此分组?

【问题讨论】:

  • 当查询连接表时,在每个列名前加上表名或表别名是非常重要的。您可能很清楚每列的来源,但它不适合我们。
  • 最简单且最有效的方法是将您的第一个查询设为sub查询。然后在外部查询中从子查询中选择。

标签: sql oracle


【解决方案1】:

使用子查询 - 外部查询方法,类似这样(未测试):

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
;

请注意,您不需要 distinct 来计算员工数量。子查询中的聚合产生了 (courseid, dateofcompletion, employeeid) 的不同三元组,因此在外部查询中,(courseid, dateofcompletion) 的每个组中的员工 ID 已经不同。

【讨论】:

    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多