2016-10-28 57 views
-1

我在这里有一个场景 - 用户需要完成2套3套课程中的任何一套,然后才能通过。如果他只完成1或2门课程,结果将为0.如果他完成了所有课程,则返回结果将为1.Oracle PLSQL - 如何查询返回结果如果找到列组合

必须完成CourseA,CourseB,CourseC以通过 或完成CourseD,CourseE,CourseF以通过

+3

用正确的样本数据和所需的输出发布您的问题。它可以帮助人们快速理解问题。 – Buddi

+1

为什么你认为你需要一个存储过程? –

+0

http://stackoverflow.com/help/how-to-ask –

回答

0

如果基表有三列:student_id,course_id和grade(通过/失败),并且还有另一个课程表,其中包含course_id和“track”(可能还有其他关于培训班)。 “轨道”是指为了毕业必须全部通过的一组课程;例如,一个“轨道”需要课程A,B,C(假设这些课程是课程ID),另一个需要D,E,F.

这是一个原型,并提供了一个可能的解决方案。

with 
    enrollments (student_id, course_id, grade) as (
     select 1001, 'A', 'Pass' from dual union all 
     select 1001, 'B', 'Pass' from dual union all 
     select 1001, 'D', 'Fail' from dual union all 
     select 1001, 'E', 'Pass' from dual union all 
     select 1002, 'A', 'Pass' from dual union all 
     select 1002, 'C', 'Pass' from dual union all 
     select 1002, 'D', 'Pass' from dual union all 
     select 1003, 'F', 'Fail' from dual union all 
     select 1005, 'A', 'Fail' from dual union all 
     select 1005, 'D', 'Pass' from dual union all 
     select 1005, 'E', 'Pass' from dual union all 
     select 1005, 'F', 'Pass' from dual 
    ), 
    courses (course_id, track) as (
     select 'A', 101 from dual union all 
     select 'B', 101 from dual union all 
     select 'C', 101 from dual union all 
     select 'D', 201 from dual union all 
     select 'E', 201 from dual union all 
     select 'F', 201 from dual 
    ) 
-- >> end of test data; the actual solution (SQL query) begins below this line << -- 
select distinct student_id 
from  enrollments e join courses c on e.course_id = c.course_id 
where grade = 'Pass' 
group by student_id, track 
having count(*) = 3 
; 

STUDENT_ID 
---------- 
1005 
+0

非常感谢!这正是我想要的。 Upvoted。 –