Рассчитать годы от каждой даты в Oracle SQL - PullRequest
1 голос
/ 30 марта 2020

нубский вопрос. Я пишу сценарий для выполнения отчета, в котором отображаются: фамилия и имя учащегося (через запятую), годы обучения, академия c фамилия и имя советника (через запятую) студенты

Борьба с подсчетом зачисленных лет и фильтрацией по активным студентам.

Используемые таблицы: enter image description here

SELECT CONCAT(CONCAT(Student.Last_Name, ', '), Student.First_Name) AS "Student", 

Student_Enrollment_Status.Date_Status_Updated,

CONCAT(CONCAT(Faculty.Last_Name, ', '), Faculty.First_Name) AS "Advisor"

FROM Student

WHERE Faculty.Faculty_ID = Student.Advisor_ID

AND Student(Student_ID) = Student_Enrollment_Status(Student_ID)

AND Student_Enrollment_Status(Status_ID) = Enrollment_Status (Status_ID);

1 Ответ

1 голос
/ 30 марта 2020

Это будет примерно так:

  • строки # 1 - 22 представляют пример данных (вы их не вводите)
  • запрос, который вам нужен, начинается со строки # 24
  • зачисленных лет рассчитывается путем вычитания текущего года и года зачисления; это довольно неточно, но - вы не объяснили, что именно точно означает
  • Я предположил, что активные состояния - это идентификаторы (2, 3, 5)

SQL> with
  2  student (student_id, first_name, last_name, advisor_id) as
  3    (select 1, 'ash', 'smith', 9 from dual union all
  4     select 2, 'tash', 'paul', 8 from dual union all
  5     select 3, 'carl', 'wall', 6 from dual union all
  6     select 4, 'fred', 'john', 3 from dual),
  7  student_enrollment_status (student_id, status_id, date_status_updated) as
  8    (select 1, 2, date '2017-09-04' from dual union all
  9     select 2, 3, date '2018-09-05' from dual union all
 10     select 3, 3, date '2018-09-05' from dual union all
 11     select 4, 2, date '2019-09-04' from dual),
 12  enrollment_status (status_id, status) as
 13    (select 2, 'enrolled'  from dual union all
 14     select 3, 'on leave'  from dual union all
 15     select 4, 'full time' from dual union all
 16     select 5, 'part time' from dual union all
 17     select 6, 'withdrawn' from dual),
 18  faculty (faculty_id, first_name, last_name) as
 19    (select 9, 'jane', 'gold'  from dual union all
 20     select 8, 'sam', 'greene' from dual union all
 21     select 6, 'mark', 'west'  from dual union all
 22     select 3, 'jen', 'dash'   from dual)
 23  --
 24  select s.last_name ||', '|| s.first_name student,
 25    extract(year from sysdate) - extract(year from ses.date_status_updated)
 26      years_enrolled,
 27    f.last_name ||', '|| f.first_name advisor
 28  from student s join student_enrollment_status ses on ses.student_id = s.student_id
 29    join enrollment_status es on es.status_id = ses.status_id
 30    join faculty f on f.faculty_id = s.advisor_id
 31  where es.status_id in (2, 3, 5)
 32  order by years_enrolled;

STUDENT     YEARS_ENROLLED ADVISOR
----------- -------------- ------------
john, fred               1 dash, jen
paul, tash               2 greene, sam
wall, carl               2 west, mark
smith, ash               3 gold, jane

SQL>
...