ORACLE SQL:根据另一列中相同键值的一列中的不同值选择多行

时间:2013-12-12 06:08:38

标签: sql oracle plsql

例如,我想获取在3月,6月,9月和11月的所有4个学期注册的学生名单。但是,我不想选择在上述任何一个月内错过报名的学生,并且除了上述4个学期外还参加了学期。

ENROLMENT_TABLE

STUDENT_NAME    SEMESTER
------------    --------

John            MAR  
Christine       NOV  
John            SEP  
Nicholas        JAN  
John            JUN  
John            NOV  
Linda           MAR  
Christine       SEP  
Linda           SEP  
Nicholas        MAR  
Linda           JUN  
Linda           NOV  

所需的结果集如下:
A)

Student_Name    Semester  
------------    --------  
John            MAR  
John            JUN  
John            SEP  
John            NOV  
Linda           MAR  
Linda           JUN  
Linda           SEP  
Linda           NOV  

B)

% STUDENT ENROLLED IN 4 SEMESTERS    % STUDENT ENROLLED IN 2 SEMESTERS     % STUDENT ENROLLED IN 1 SEMESTERS  
-------------------------            ---------------------------------     -------------------------  
50                                   30                                     20  

上述两个输出A和B的高效SQL或PL / SQL是什么?

2 个答案:

答案 0 :(得分:1)

select  sum(case when semesters = 1 then 1 else else 0 end ) / count(*) as Pct_Students_enrolled_1, 
    sum(case when semesters = 2 then 1 else else 0 end ) / count(*) as Pct_Students_enrolled_2
    sum(case when semesters = 4 then 1 else else 0 end ) / count(*) as Pct_Students_enrolled_4
from (
    select  student_name , count(*) as semesters
    from    enrolment_table
    group by student_name );

答案 1 :(得分:0)

假设组合(student_name,semester)是唯一的,那么你可以这样做:

    SELECT student_name, semester 
        FROM enrolment_table e
        WHERE (SELECT COUNT(*) FROM enrolment_table 
               WHERE student_name = e.student_name 
               AND semester in ('MAR', 'JUN', 'SEP', 'NOV'))=4