使用两个日期列创建新行并重复一个总和值
create new rows using two date columns and repeating a sum value
具有此设置:
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;
我试图得到这个结果:
想法是 date_ini
和 date_fin
,重新创建日期值介于 date_ini
和 date_fin
之间的行以及所有 elements
.
老实说,我不知道怎么开始
您可以使用递归查询来执行此操作:
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
同样可以通过如下的子查询重构来完成。
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;
具有此设置:
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;
我试图得到这个结果:
想法是 date_ini
和 date_fin
,重新创建日期值介于 date_ini
和 date_fin
之间的行以及所有 elements
.
老实说,我不知道怎么开始
您可以使用递归查询来执行此操作:
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
同样可以通过如下的子查询重构来完成。
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;