SQL расщепление строк - PullRequest
       1

SQL расщепление строк

0 голосов
/ 05 декабря 2018

Пожалуйста, сообщите мне, как я могу разделить записи так, как я описал ниже.

У меня есть таблица, как показано ниже

Текущие данные

EMPL | C2 | C3 | DateFrom   | DateTo     | C6 | C7
-----+----+----+------------+------------+----+----
1    | B  | C  | 11/27/2018 | 12/31/9999 | D  | E
2    | B  | C  | 11/27/2018 | 05/31/2019 | D  | E
3    | B  | C  | 11/27/2017 | 06/31/2019 | D  | E

Мне нужноразбить каждую строку на две или более записей, основанных на текущем году.

В случае EMPL 1 мне нужно разбить строку на две части. В одной я должен указать последний день текущего года, а в другой - DateFrom.установить в качестве первого дня следующего года, но DateTo должно быть 12/31/9999

В случае EMPL 2 мне нужно разделить эту запись на две записи, как показано в примере

В случае 3 должно быть 3 записи, по одной на каждый год.

Результаты

EMPL | C2 | C3 | DateFrom   | DateTo     | C6 | C7
-----+----+----+------------+------------+----+---
1    | B  | C  | 11/27/2018 | 12/31/2018 | D  | E
1    | B  | C  | 01/01/2019 | 12/31/9999 | D  | E
2    | B  | C  | 11/27/2018 | 12/31/2018 | D  | E
2    | B  | C  | 01/01/2019 | 05/31/2019 | D  | E
3    | B  | C  | 11/27/2017 | 12/31/2017 | D  | E
3    | B  | C  | 01/01/2018 | 12/31/2018 | D  | E
3    | B  | C  | 01/01/2019 | 06/31/2019 | D  | E

1 Ответ

0 голосов
/ 05 декабря 2018

Установка Oracle :

CREATE TABLE table_name ( EMPL, C2, C3, DateFrom, DateTo, C6, C7 ) AS
SELECT 1, 'B', 'C', DATE '2018-11-27', DATE '9999-12-31', 'D', 'E' FROM DUAL UNION ALL
SELECT 2, 'B', 'C', DATE '2018-11-27', DATE '2019-05-31', 'D', 'E' FROM DUAL UNION ALL
SELECT 3, 'B', 'C', DATE '2017-11-27', DATE '2019-06-30', 'D', 'E' FROM DUAL;

Запрос :

WITH years ( EMPL, C2, C3, DateFrom, DateTo, C6, C7, YearEnd ) AS (
  SELECT t.*,
         ADD_MONTHS( TRUNC( DateFrom, 'YYYY' ), 12 ) - 1
  FROM   table_name t
UNION ALL
  SELECT EMPL,
         C2,
         C3,
         YearEnd + 1,
         DateTo,
         C6,
         C7,
         CASE WHEN YearEnd + 1 < SYSDATE
         THEN ADD_MONTHS( YearEnd, 12 )
         ELSE DateTo
         END
  FROM   years
  WHERE  YearEnd < DateTo
)
SELECT EMPL,
       C2,
       C3,
       DateFrom,
       LEAST( YearEnd, DateTo ) AS DateTo,
       C6,
       C7
FROM   years
ORDER BY Empl, C2, C3, C6, C7, DateFrom;

Вывод :

EMPL    C2  C3  DATEFROM    DATETO      C6  C7
----    --  --  ----------  ----------  --  --
1       B   C   2018-11-27  2018-12-31  D   E
1       B   C   2019-01-01  9999-12-31  D   E
2       B   C   2018-11-27  2018-12-31  D   E
2       B   C   2019-01-01  2019-05-31  D   E
3       B   C   2017-11-27  2017-12-31  D   E
3       B   C   2018-01-01  2018-12-31  D   E
3       B   C   2019-01-01  2019-06-30  D   E
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...