使用SQL生成“资源分配”报告

时间:2013-07-14 11:03:53

标签: sql oracle oracle10g

我正在尝试根据以下两个表生成报告:

  Name        Start Year    End Year    No. Of Students Fill Order
School-ABC      2000         2004            1             1
School-DEF      2000         2004            2             3    
School-GHI      2000         2004            1             2    

  Name        Start Year    End Year    Joined On
Student-1       2000         2004        01-Jan
Student-2       2000         2004        03-Jan
Student-3       2000         2004        02-Jan
Student-4       2000         2004        15-Jan

预期产出低于:

  Name        Start Year    End Year    Joined On    School
Student-1       2000         2004        01-Jan     School-ABC
Student-2       2000         2004        03-Jan     School-DEF
Student-3       2000         2004        02-Jan     School-GHI
Student-4       2000         2004        15-Jan     School-DEF      

生成数据背后的逻辑:

  1. 第一张表格包含学校名单和可用座位(以及FCFS基础上为学生分配席位的优先顺序)
  2. 第二张表包含入学的学生名单数据,包括入学日期和课程开始/结束年份。
  3. 我需要根据分配给每个学生的“填写顺序”来填充。
  4. 在分析问题一段时间之后,我得出结论,单独使用选择查询可能无法实现这一点。目前,我计划为每个表使用两个游标并逐行处理记录。有没有更好的方法,或通过选择语句可以吗? TIA

    注意:

    • 我使用的数据库是Oracle 10g
    • 我无法创建任何临时表或更改任何表中的数据。我严格拥有对数据库的只读权限。

1 个答案:

答案 0 :(得分:1)

您可以使用Oracle分析功能。 row_number() over ()可以根据加入日期为每位学生分配一个号码。 sum() over ()可以计算每所学校的第一个和最后一个学生。结合你得到的两个:

select  stud.name
,       stud.startyear
,       stud.endyear
,       stud.joinedon
,       schl.name as SchoolName
from    (
        select  name
        ,       coalesce(sum(NoOfStudents) over (order by FillOrder
                    range between unbounded preceding and 1 preceding),0)+1 FirstStudent
        ,       sum(NoOfStudents) over (order by FillOrder) as LastStudent
        from    Schools
        ) schl
join    (
        select  row_number() over (order by JoinedOn) as StudentRank
        ,       Students.*
        from    Students
        ) stud
on      stud.StudentRank between schl.FirstStudent and schl.LastStudent
order by
        stud.name

Live example at SQL Fiddle.