Получить будущие годы на основе поля в таблице для сотрудника - PullRequest
0 голосов
/ 08 марта 2020

У меня есть требование, чтобы получить будущие годы на основе поля, доступного для сотрудника в таблице «Сотрудник», и даты выплаты пособий. Ниже приведены две таблицы, и ожидаемый результат показан ниже для двух сотрудников XYZ и AB C , Табличные данные для сотрудника

enter image description here

Пособие сотрудника Таблица дат

enter image description here

Ожидаемый результат enter image description here

Случай 1 - Скажите, что XYZ сотрудника имеет значение 5, а запрос выполняется 31/31/2020, затем запрос должен будет вернуться, как показано ниже Ввод - 31.03.2020 Ожидаемый вывод в строках 2020 2021 2022 2023 2024 2025+

Случай 2 Скажем, сотрудник AB C имеет значение 10, а запрос выполняется 31/31/2020, затем запрос должен быть возвращен, как показано ниже во втором столбце таблицы сотрудников и все вышеперечисленные годы следует указывать как (год) +. Я пытался использовать описания случаев для получения лет, но хотел бы получить некоторую динамическую оценку этого на основе поля значения.

Заранее спасибо.

1 Ответ

0 голосов
/ 08 марта 2020

Это один из вариантов; См. Комментарии в коде.

SQL> with
  2  -- sample data
  3  emp (employee, years) as
  4    (select 'XYZ',  5 from dual union all
  5     select 'ABC', 10 from dual
  6    ),
  7  benefit (employee, bdate) as
  8    (select 'XYZ', 2021 + level - 1
  9     from dual
 10     connect by level <= 7
 11     union all
 12     select 'ABC', 2021 + level - 1
 13     from dual
 14     connect by level <= 13
 15    )
 16  select
 17    b.employee,
 18    case when b.bdate = x.bdate + e.years then to_char(b.bdate - 1) || '+'
 19         else to_char(b.bdate)
 20    end bdate
 21  from benefit b join emp e on e.employee = b.employee
 22  join (-- find MIN(bdate) per employee
 23        select b1.employee,
 24               min(b1.bdate) bdate
 25        from benefit b1
 26        group by b1.employee
 27       ) x on x.employee = b.employee
 28  and b.bdate <= (-- limit number of rows displayed
 29                  select min(b1.bdate) + e.years
 30                  from benefit b1
 31                  where b1.employee = b.employee
 32                 )
 33  order by b.employee desc, b.bdate;

EMP BDATE
--- -----------------------------------------
XYZ 2021
XYZ 2022
XYZ 2023
XYZ 2024
XYZ 2025
XYZ 2025+
ABC 2021
ABC 2022
ABC 2023
ABC 2024
ABC 2025
ABC 2026
ABC 2027
ABC 2028
ABC 2029
ABC 2030
ABC 2030+

17 rows selected.

SQL>

Желаемый вывод, который вы опубликовали, является противоречивым; для XYZ написано 2026+, что не соответствует ABC 2030+ (должно быть 2031+) (или XYZ должно быть 2025+, если ABC правильно). В любом случае, это легко исправить.

...