Reputation: 551
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:
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
Reputation: 5072
The same can be done with just subquery refactoring like below.
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
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
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