Объединить две таблицы и реплицировать строки, используя два столбца даты - PullRequest
2 голосов
/ 16 апреля 2020

У меня есть эти таблицы:

CREATE TABLE TABLE_4 
(
    DATE_INI    DATE NOT NULL,
    DATE_FIN    DATE NOT NULL,
    TOT_CLIENT  NUMBER NOT NULL,
    LOCATOR NUMBER NOT NULL
);

INSERT INTO TABLE_4 (DATE_INI, DATE_FIN, TOT_CLIENT, LOCATOR) 
VALUES (to_date('19/9/23', 'RR/MM/DD'), to_date('19/9/26', 'RR/MM/DD'), 3, 758908);
INSERT INTO TABLE_4 (DATE_INI, DATE_FIN, TOT_CLIENT, LOCATOR) 
VALUES (to_date('19/9/23', 'RR/MM/DD'), to_date('19/9/26', 'RR/MM/DD'), 2, 765590);

CREATE TABLE TABLE_5 
( 
    LOCATOR     NUMBER NOT NULL,
    DATE_CLIENT DATE NOT NULL,
    NAME        VARCHAR2(250) NOT NULL
);

INSERT INTO TABLE_5 (LOCATOR, DATE_CLIENT, NAME) 
VALUES (758908, to_date('19/9/23', 'RR/MM/DD'), 'Maria');
INSERT INTO TABLE_5 (LOCATOR, DATE_CLIENT, NAME) 
VALUES (758908, to_date('19/9/23', 'RR/MM/DD'), 'Luis');
INSERT INTO TABLE_5 (LOCATOR, DATE_CLIENT, NAME) 
VALUES (758908, to_date('19/9/23', 'RR/MM/DD'), 'Pedro');
INSERT INTO TABLE_5 (LOCATOR, DATE_CLIENT, NAME) 
VALUES (765590, to_date('19/9/23', 'RR/MM/DD'), 'Manuel');
INSERT INTO TABLE_5 (LOCATOR, DATE_CLIENT, NAME) 
VALUES (765590, to_date('19/9/23', 'RR/MM/DD'), 'Ana');

CREATE SEQUENCE SEQ_TABLE_6  
MINVALUE 1 MAXVALUE 9999999999999999999999999999 
INCREMENT BY 1 
START WITH 2206 
NOCACHE ORDER NOCYCLE NOKEEP NOSCALE GLOBAL;

CREATE TABLE TABLE_6 
(
     ID NUMBER DEFAULT SEQ_TABLE_6.nextval  NOT NULL,
     ACTUAL_DATE    DATE NOT NULL,
     DATE_INI       DATE NOT NULL,
     DATE_FIN       DATE NOT NULL,
     LOCATOR        NUMBER NOT NULL,
     NAME           VARCHAR2(250) NOT NULL
);

Возможно ли получить этот результат?

enter image description here

Идея такова:

  1. Создание строк на основе date_ini и date_fin, создание всех дат между этими столбцами. Как вы видите на "фактической дате" в таблице_6

  2. Копируйте информацию, которую мы имеем в таблице_5 по строкам дат

Может кто-нибудь помочь мне с этим запрос?

С уважением

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Это можно сделать с помощью рекурсивного запроса:

insert into table_6(actual_date, date_ini, date_fin, locator, name) 
with cte (actual_date, date_ini, date_fin, locator, name) as (
    select t4.date_ini actual_date, t4.date_ini, t4.date_fin, t5.locator, t5.name
    from table_4 t4
    inner join table_5 t5 on t5.date_client = t4.date_ini and t5.locator = t4.locator
    union all
    select actual_date + 1, date_ini, date_fin, locator, name
    from cte
    where actual_date < date_fin
)
select * from cte

Демонстрация на DB Fiddle :

  ID | ACTUAL_DATE | DATE_INI  | DATE_FIN  | LOCATOR | NAME  
---: | :---------- | :-------- | :-------- | ------: | :-----
2206 | 23-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Maria 
2207 | 23-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Luis  
2208 | 23-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Pedro 
2209 | 23-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Manuel
2210 | 23-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Ana   
2211 | 24-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Maria 
2212 | 24-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Luis  
2213 | 24-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Pedro 
2214 | 24-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Manuel
2215 | 24-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Ana   
2216 | 25-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Maria 
2217 | 25-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Luis  
2218 | 25-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Pedro 
2219 | 25-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Manuel
2220 | 25-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Ana   
2221 | 26-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Maria 
2222 | 26-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Luis  
2223 | 26-SEP-19   | 23-SEP-19 | 26-SEP-19 |  758908 | Pedro 
2224 | 26-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Manuel
2225 | 26-SEP-19   | 23-SEP-19 | 26-SEP-19 |  765590 | Ana   
0 голосов
/ 16 апреля 2020

Вы можете сделать то же самое с факторингом подзапроса, как показано ниже

        WITH data
         AS (SELECT date_ini + column_value - 1 AS dates,
                    date_ini,
                    date_fin,
                    tot_client,
                    locator
             FROM   table_4
                    cross join TABLE(Cast(MULTISET (SELECT LEVEL
                                              FROM   dual
                                              CONNECT BY date_ini + LEVEL <=
                                                         date_fin + 1
                                                   )
                                          AS
         sys.ODCINUMBERLIST))),
         data1
         AS (SELECT dates,
                    date_ini,
                    date_fin,
                    locator
             FROM   data
             ORDER  BY dates,
                       date_ini,
                       date_fin,
                       locator)
    SELECT d1.*,
           t5.name
    FROM   data1 d1,
           table_5 t5
    WHERE  d1.locator = t5.locator 
    and d1.date_ini=t5.date_client

Вывод ниже

        DATES   DATE_INI    DATE_FIN    LOCATOR NAME
    23-SEP-19   23-SEP-19   26-SEP-19   758908  Pedro
    23-SEP-19   23-SEP-19   26-SEP-19   758908  Maria
    23-SEP-19   23-SEP-19   26-SEP-19   758908  Luis
    23-SEP-19   23-SEP-19   26-SEP-19   765590  Manuel
    23-SEP-19   23-SEP-19   26-SEP-19   765590  Ana
    24-SEP-19   23-SEP-19   26-SEP-19   758908  Pedro
    24-SEP-19   23-SEP-19   26-SEP-19   758908  Luis
    24-SEP-19   23-SEP-19   26-SEP-19   758908  Maria
    24-SEP-19   23-SEP-19   26-SEP-19   765590  Ana
    24-SEP-19   23-SEP-19   26-SEP-19   765590  Manuel
    25-SEP-19   23-SEP-19   26-SEP-19   758908  Maria
    25-SEP-19   23-SEP-19   26-SEP-19   758908  Luis
    25-SEP-19   23-SEP-19   26-SEP-19   758908  Pedro
    25-SEP-19   23-SEP-19   26-SEP-19   765590  Ana
    25-SEP-19   23-SEP-19   26-SEP-19   765590  Manuel
    26-SEP-19   23-SEP-19   26-SEP-19   758908  Maria
    26-SEP-19   23-SEP-19   26-SEP-19   758908  Luis
    26-SEP-19   23-SEP-19   26-SEP-19   758908  Pedro
    26-SEP-19   23-SEP-19   26-SEP-19   765590  Ana
    26-SEP-19   23-SEP-19   26-SEP-19   765590  Manuel
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...