у меня есть две таблицы
Leave_policy
:Empl_Leave
:Моя цель — получить прогнозы отпусков сотрудников (текущий баланс отпусков + LeaveRate * Количество начислений) на следующие шесть месяцев с последней даты начисления, а также прогнозы отпусков до годовщины приема на работу сотрудника. Что-то вроде этого:
У сотрудника есть начисление отпусков раз в две недели, так как только два в месяц, столбцы Months_until и LeaveType_Id определяют, сколько Leave_Rate_Per_Every_Accrual будет, как в первой таблице. Months_Until — это разница в периоде владения в МЕСЯЦЕ между датой начисления отпуска и датой найма. В промежутках между этими расчетами я должен следить за Annual_Max_Carryover, если дата пересекается в следующем году. Я использую SQL 2019.
Я попробовал использовать рекурсивный CTE.
«какое-то расчетное значение» ничего не объясняет. Не забывайте, мы не можем ни видеть ваши характеристики, ни читать ваши мысли. Вам необходимо предоставить нам всю информацию, чтобы мы могли ответить на ваш вопрос. Это означает предоставление образцов данных и ожидаемых результатов, а также четкое определение необходимой вам логики; не расплывчатые требования.
@siggemannen, прошу прощения, я забыл добавить эту информацию в вопрос, сейчас я внес изменения в вопрос со всеми подробностями. Каждый период оплаты происходит начисление отпуска и добавляется баланс, Текущий баланс + Leave_Rate_Per_Every_Accural. Да, если целевая дата пересекает год, тогда весь текущий баланс будет сброшен до баланса Max_Carry_Over и к нему будет добавлена ставка отпуска для остальных периодов оплаты до целевой даты.
@ThomA, извините, я неправильно указал детали, я просто обновил вопрос, указав правильные детали. Да, я имею в виду текущий итог.
Months_Until is a tenure period MONTH diff between Accrual Date and accrual Date.
- возможно... и дата найма?
@ValNik — Кажется, я неправильно ввел дату начисления в эту таблицу — дата начисления одинакова для всех сотрудников с 07 по 27. Также для ""Months_Until - это разница в периоде владения МЕСЯЦОМ между датой начисления и датой начисления"" Да, сэр, это опечатка - да, это разница между датами начисления и датой найма.
Для Last_Accrual_date 27 июля 2024 г., какие следующие 6 дат начисления? Если каждые 2 недели, то 2024-07-27
-0, 2024-08-03(1), 2024-08-10
(2), 2024-08-17(3), 2024-08-24
(4), 2024-08-31(5), 2024-09-07
(6) .
@ValNik - Я ищу прогнозы на следующие 6 месяцев с 07 по 27, так что это будет каждое начисление с 07 по 27 каждые две недели, но не более двух в месяц. Итак, какие бы начисления ни происходили с 07 по 27 по 01 -27-2025
См. (dbfiddle.uk/oLvdmBFY). В ноябре 3 начисления( если считать каждые 2 недели).
@ValNik Да, сэр, но мне следует снимать только первые два начисления в месяц, так как есть лимит -
Пожалуйста, отредактируйте вопрос и добавьте правильную дату последнего_начисления, укажите лимит начислений в 2 месяца. И From_months по сравнению с (Accrual_date-Hire_date).
@ValNik - сейчас я обновил вопрос. Извините за это
Задача показалась мне интересной и довольно сложной. Пожалуйста (проголосуйте за) повторно откройте вопрос для получения ответов. Предполагаемое решение в примере (dbfiddle.uk/BmelfWkU)
Пожалуйста, прочитайте минимально воспроизводимый пример и Почему мне следует предоставлять минимально воспроизводимый пример для очень простого SQL-запроса?
Пример для SQL Server 2019 (dbfiddle.uk/dKmce3nE)
@VaiNik Большое спасибо. Я не могу отблагодарить вас... «Потрясающе» одним словом. Есть ли способ изменить Annual_Max_CarryOver, чтобы он происходил в годовщину найма сотрудника, а не в первый Новый год? Просто проверяю.
Итак, каждый месяц надо отчислять из
Current_balance
чего,Leave_Rate_Per_Every_Accural * 2
? а еслиbalance is > Annual_Max_CarryOver
, то баланс должен быть скорректирован доAnnual_Max_CarryOver
по прошествии года? КакFrom_month
контролирует ситуацию?