У меня есть таблица PaymentSchedules
с информацией о процентах и датами от / до, для которых эти проценты действительны, ресурс за ресурсом:
| auto_numbered | res_id | date_start | date_end | org | pct |
|---------------+--------+------------+------------+-------+-----|
| 1 | A | 2018-01-01 | 2019-06-30 | One | 100 |
| 2 | A | 2019-07-01 | (NULL) | One | 60 |
| 3 | A | 2019-07-02 | 2019-12-31 | Two | 40 |
| 4 | A | 2020-01-01 | (NULL) | Two | 40 |
| 5 | B | (NULL) | (NULL) | Three | 100 |
| 6 | C | 2018-01-01 | (NULL) | One | 100 |
| 7 | C | 2019-11-01 | (NULL) | Four | 100 |
(Записи № 3 и № 4 можно суммировать только на одну строку, но специально продублированы, чтобы показать, что существует множество комбинаций date_start
и date_end
.)
Быстрое чтение данных:
Орг "Один" полностью оплачивает ресурс А до 2019-06-30; затем он продолжает оплачивать 60% стоимости, но остальная часть (40%) оплачивается организацией "Два" с 2019-07-02.
Это должно начаться с 2019-07-01. ... небольшая ошибка кодирования ... провоцирует разрыв в 1 день.
Орган "Три" всегда полностью оплачивает ресурс B.
Организация "Один" полностью оплачивает ресурс C с 2018-01-01 ... но, начиная с 2019-01-11, организация "Четыре" оплачивает его ...
... и там есть ошибка кодирования: у нас есть 200% ресурса C, учитываемого с 2019-11-01: запись № 6 должна была быть закрыта (date_end
установлено на 2019- 10-31), но не имеет ...
Итак, когда мы генерируем финансовый отчет за 2019 год (с 2019-01-01 по 2019-12-31) у нас будут ошибки в расчетах ...
Итак, вопрос: как мы можем быть уверены, что у нас нет пересекающихся платежей за ресурсы, или, наоборот, "дыры" для некоторых период времени?
Как это возможно написать SQL запрос , чтобы убедиться, что нет недоплаченных или переплаченных ресурсов? То есть все ресурсы в таблице должны оплачиваться за каждый день финансового периода, который просматривается, ровно одной или несколькими организациями таким образом, чтобы суммарный процент всегда был равен 100% .
Я не понимаю, как выполнить такой запрос. Кто-нибудь в состоянии дать подсказки, чтобы поставить меня в нужное русло?
РЕДАКТИРОВАТЬ - Работа с SQL Сервер и Oracle.
РЕДАКТИРОВАТЬ - - Мне не принадлежит БД, я не могу добавлять триггеры или представления. Мне нужно иметь возможность обнаруживать вещи «после фактов» ... Нужно легко обнаружить конфликтные записи или «пропущенные» (в случае «дыр в периодах»), исправить их вручную, а затем повторно запустить финансовый отчет.
РЕДАКТИРОВАТЬ - Если мы проведем анализ на 2019 год, потребуется следующий отчет:
| res_id | pct_sum | date |
|--------+---------+------------|
| A | 60 | 2019-07-01 |
| C | 200 | 2019-11-01 |
| C | 200 | 2019-11-02 |
| C | 200 | ... |
| C | 200 | ... |
| C | 200 | ... |
| C | 200 | 2019-12-30 |
| C | 200 | 2019-12-31 |
или, конечно, даже намного лучшая версия - конечно, недостижимая? - когда один тип проблемы будет присутствовать один раз с соответствующим диапазоном дат, для которого наблюдается проблема:
| res_id | pct_sum | date_start | date_end |
|--------+---------+------------+------------|
| A | 60 | 2019-07-01 | 2019-07-01 |
| C | 200 | 2019-11-01 | 2019-12-31 |
РЕДАКТИРОВАТЬ - Код скрипты: дБ <> скрипка здесь