如何使用HAVING子句设置动态值,筛选完成全部规定课程的参与者
课程完成参与者筛选需求
我目前有6门课程,需要筛选出修完全部6门课程的参与者。
原始统计数据
| month | participant_id | count |
|---|---|---|
| 2021-08 | 1 | 6 |
| 2021-08 | 2 | 6 |
| 2021-08 | 3 | 4 |
| 2021-08 | 4 | 6 |
期望筛选结果
| month | participant_id | count |
|---|---|---|
| 2021-08 | 1 | 6 |
| 2021-08 | 2 | 6 |
| 2021-08 | 4 | 6 |
现有查询与优化需求
以下是我编写的示例查询语句,我希望将HAVING子句行的阈值设置为动态值,而非写死的count(c.name) >= 6。我需要实现动态值的原因是,一旦后续需要删除2门或更多课程,阈值可以自动匹配当前有效课程的总数,始终准确筛选出修完所有现有规定课程的参与者。
SELECT TO_CHAR(CA.LOG_IN_DATETIME, 'YYYY-MM') AS MONTH, CA.PARTICIPANT_ID, COUNT(DISTINCT C.NAME) FROM FRS.COURSE_ATTENDANCE CA INNER JOIN FRS.COURSE_SCHEDULE_DETAIL AS CSD ON CA.COURSE_SCHEDULE_DETAIL_ID = CSD.COURSE_SCHEDULE_ID INNER JOIN FRS.COURSE_SCHEDULE AS CS ON CSD.COURSE_SCHEDULE_ID = CS.ID INNER JOIN FRS.COURSE AS C ON CS.COURSE_ID = C.ID INNER JOIN FRS.COURSE_CATEGORY AS CC ON C.COURSE_CATEGORY_ID = CC.ID INNER JOIN FRS.EMPLOYEE AS E ON CA.PARTICIPANT_ID = E.ID INNER JOIN FRS.MEMBER_ROLE AS MR ON E.MEMBER_ROLE_ID = MR.ID WHERE C.NAME IN (SELECT C.NAME FROM FRS.COURSE C JOIN FRS.COURSE_CATEGORY CC ON C.COURSE_CATEGORY_ID = CC.ID WHERE CC.CATEGORY = 'RGB Standard') AND CA.STATUS = 'P' AND C.MANDATORY = 'Yes' AND MR.ROLE_TYPE = 'RGB' AND CC.CATEGORY = 'RGB Standard' GROUP BY MONTH, PARTICIPANT_ID HAVING COUNT(C.NAME) >= 6
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

