【问题标题】:create new rows using two date columns and repeating a sum value使用两个日期列创建新行并重复总和值
【发布时间】:2020-04-14 08:19:19
【问题描述】:

进行此设置:

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_inidate_fin 重新创建日期值介于date_inidate_fin 之间的行以及所有elements 的总和。 老实说,我不知道如何开始

【问题讨论】:

  • 您需要使用 SUM 和 GROUP BY 进行递归查询。

标签: sql oracle group-by oracle-apex recursive-query


【解决方案1】:

您可以使用递归查询来做到这一点:

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

日期 | DATE_INI | DATE_FIN | SUM_ELEMENTS :-------- | :-------- | :-------- | ------------: 01-APR-19 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 2 月 2 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 3 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 4 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 5 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 6 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 7 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 8 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 9 日 | 01-APR-19 | 19 年 4 月 10 日 | 57 19 年 4 月 10 日 | 01-APR-19 | 19 年 4 月 10 日 | 57

【讨论】:

    【解决方案2】:

    只需像下面这样的子查询重构也可以做到这一点。

    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; 
    

    【讨论】:

      猜你喜欢
      • 2019-07-29
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2020-11-10
      相关资源
      最近更新 更多