Julio
Julio

Reputation: 551

create new rows using two date columns and repeating a sum value

Having this set-up:

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

CREATE TABLE TABLE_3 ( 
     ID NUMBER DEFAULT SEQ_TABLE_3.nextval  NOT NULL
    ,DATE_INI   DATE NOT NULL
    ,DATE_FIN   DATE NOT NULL
    ,ELEMENTS   NUMBER
);


Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),3);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),2);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),1);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),5);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),4);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),6);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),9);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),1);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),2);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),4);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),5);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),6);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),2);
Insert into TABLE_3 (DATE_INI,DATE_FIN,ELEMENTS) values (to_date('19/04/01','RR/MM/DD'),to_date('19/04/10','RR/MM/DD'),7);
commit;

I am trying to get this result:

enter image description here

The idea is having date_ini and date_fin, recreate rows with date values that will be between date_ini and date_fin and the sum of all elements. To be honest, i don't know how start

Upvotes: 1

Views: 44

Answers (2)

psaraj12
psaraj12

Reputation: 5072

The same can be done with just subquery refactoring like below.

The DEMO here

        WITH data
         AS (SELECT date_ini + column_value - 1 AS dates,
                    date_ini,
                    date_fin,
                    elements
             FROM   table_3
                    cross join TABLE(Cast(MULTISET (SELECT LEVEL
                                              FROM   dual
                                              CONNECT BY date_ini + LEVEL <=
                                                         date_fin + 1
                                                   )
                                          AS
         sys.ODCINUMBERLIST)))
    SELECT dates,
           date_ini,
           date_fin,
           SUM(elements)
    FROM   data
    GROUP  BY dates,
              date_ini,
              date_fin
    ORDER  BY dates,
              date_ini,
              date_fin; 

Upvotes: 0

GMB
GMB

Reputation: 222582

You can do this with a recursive query:

with cte(dates, date_ini, date_fin, sum_elements) as (
    select date_ini dates, date_ini, date_fin, sum(elements) sum_elements 
    from table_3
    group by date_ini, date_fin
    union all
    select dates + 1, date_ini, date_fin, sum_elements
    from cte
    where dates < date_fin
)
select * from cte

Demo on DB Fiddle:

DATES     | DATE_INI  | DATE_FIN  | SUM_ELEMENTS
:-------- | :-------- | :-------- | -----------:
01-APR-19 | 01-APR-19 | 10-APR-19 |           57
02-APR-19 | 01-APR-19 | 10-APR-19 |           57
03-APR-19 | 01-APR-19 | 10-APR-19 |           57
04-APR-19 | 01-APR-19 | 10-APR-19 |           57
05-APR-19 | 01-APR-19 | 10-APR-19 |           57
06-APR-19 | 01-APR-19 | 10-APR-19 |           57
07-APR-19 | 01-APR-19 | 10-APR-19 |           57
08-APR-19 | 01-APR-19 | 10-APR-19 |           57
09-APR-19 | 01-APR-19 | 10-APR-19 |           57
10-APR-19 | 01-APR-19 | 10-APR-19 |           57

Upvotes: 2

Related Questions