ORACLE SQL-查找现役救济教师的数量,每位教师在教师辞职前有1个月

时间:2019-07-16 05:08:03

标签: sql oracle

我需要帮助来确定学校中每位教师辞职前1-3个月中有多少位救济老师。如果减免的最新No_of_reliefs_1不在老师{{的1-3个月内),则预期输出中的No_of_reliefs_2No_of_reliefs_3end_date应等于0 1}}。

resign_dateStart_dt是指救济教师的开始日期和结束日期。 End_dt指的是每个No_of_relief具有的不同的relief_id

teacher_id

预期输出:

Teacher_ID Relief_ID Resign_date Start_date End_date No_of_Reliefs
12        20           2019-05-21  2019-03-22  2019-04-28  1
12        6            2019-05-21  2019-04-02  2019-04-22  1
12        10           2019-05-21  2019-01-01  2019-01-10  1
12        7            2019-05-21  2018-10-02  2018-11-15  1
23        21           null        2019-05-05  2019-05-18  1
23        18           null        2019-02-01  2019-03-30  1
23        30           null        2019-09-20  2018-12-20  1
1         4            2018-11-02  2018-08-10  2019-09-15  1

我知道我可能必须使用connectby子句来查找Teacher_ID Resign_date No_of_relief_1 No_of_relief_2 No_of_relief_3 12 2019-05-21 2 1 0 23 null 0 1 0 1 2018-11-02 0 1 1 Start_dt之间的日期。但是,由于我有大量数据,因此执行起来将花费很长时间。因此,我想知道是否还有其他更简单的方法可以做到这一点。 谢谢!任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您需要使用聚合(GROUP BY)函数来计算每位老师的减免数量。使用CASE设置有条件的总和。

select teacher_id
       ,resign_date
       ,sum(case 
              when resign_date is null then 0
              when end_date >= resign_date - interval '1' month then no_of_reliefs
              else 0
            end ) as no_of_reliefs_1
       ,sum(case 
              when resign_date is null then 0
              when end_date < resign_date - interval '1' month 
                   and end_date >= resign_date - interval '2' month then no_of_reliefs
              else 0
            end ) as no_of_reliefs_2
       ,sum(case 
              when resign_date is null then 0
              when end_date < resign_date - interval '2' month 
                   and end_date >= resign_date - interval '3' month then no_of_reliefs
              else 0
            end ) as no_of_reliefs_3
from your_table
group by teacher_id
        ,resign_date               

注意:您的预期输出似乎不是从遵循您发布的规则的示例输出中得出的。我怀疑这是一个“粘贴”问题:例如,当老师23尚未辞职时,他们怎么能将No_of_relief_2 = 1?因此,我已尽我所能。如果按照您的预期无法解决问题,请编辑问题以阐明您的要求并调整所需的输出。