Вставка инкрементной даты в отдельный запрос Select - PullRequest
0 голосов
/ 27 апреля 2018

Я унаследовал следующий запрос: -

SELECT
 d.dt --date
,fuel --vchar
,SUM(revenue) revenue --number

FROM
    (
    SELECT
     ADD_MONTHS(TRUNC(SYSDATE,'mm'),-ROWNUM + 1)-1 dt     
    FROM dual    
    ) d

<<SNIP>> 

WHERE rn = 1    

GROUP BY
 d.dt
,fuel;

Возвращает сумму за предыдущий месяц.

Можно ли как-то зациклить это так, чтобы оно возвращало результаты для определенных исторических дней. Статический пример будет: -

SELECT
 d.dt --date
,fuel --vchar
,SUM(revenue) revenue --number

FROM
    (
    SELECT to_date('31-08-2017', 'dd-MM-yyyy') dt     
    FROM dual    
    ) d

<<SNIP>> 

WHERE rn = 1    

GROUP BY
 d.dt
,fuel;

Мне удалось написать код для генерации интересующих меня дат: -

DECLARE
    startdate   DATE := TO_DATE('31/08/2016','dd/mm/yyyy');
    enddate     DATE := trunc(SYSDATE,'MM') - 1;
    usedate     DATE := enddate;
BEGIN
    LOOP
        usedate := add_months(usedate,-1);
        dbms_output.put_line(usedate);
        EXIT WHEN usedate <= startdate;
    END LOOP;
END;

... с использованной датой, о которой идет речь, но мне неясно, как использовать эти даты в исходном запросе.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Вы пропустили количество месяцев между датой начала и датой использования. Не уверен, как вы смогли сгенерировать свои даты с помощью кода как usedate: = add_months (usedate, -1); всегда даст вам статическое значение = 28-FEB-18. В моем примере я использую немного другую дату начала, которую я предлагаю для вашего тестирования:

 SELECT start_date
      , end_date
      , add_months(use_date,-LEVEL) stop_date
      , MONTHS_BETWEEN(use_date, start_date) months_diff -- increment number
  FROM
  (
   SELECT TO_DATE('31/08/2017','dd/mm/yyyy')   start_date 
        , trunc(SYSDATE,'MM')-1                end_date
        , add_months(trunc(SYSDATE,'MM')-1,-1) use_date
    FROM dual
 )
 CONNECT BY LEVEL <= MONTHS_BETWEEN(use_date, start_date) -- will run 6 times = months_diff --
/

START_DATE  END_DATE    STOP_DATE   MONTHS_DIFF
--------------------------------------------------
31-AUG-17   31-MAR-18   31-JAN-18   6
31-AUG-17   31-MAR-18   31-DEC-17   6
31-AUG-17   31-MAR-18   30-NOV-17   6
31-AUG-17   31-MAR-18   31-OCT-17   6
31-AUG-17   31-MAR-18   30-SEP-17   6
31-AUG-17   31-MAR-18   31-AUG-17   6  <<-- stopped here as stop_date equals to start date
0 голосов
/ 27 апреля 2018

Вы можете попробовать, как показано ниже. Читать комментарии inline.

DECLARE
  startdate DATE := TO_DATE('31/08/2016','dd/mm/yyyy');
  enddate   DATE := TRUNC(SYSDATE,'MM') - 1;
  usedate   DATE := enddate;
--Record to hold resultset from the Select query.
type UserInfo     IS      record
  (
    dt     DATE,
    fuel   VARCHAR2(100),
    revnue NUMBER );
TYPE v_UserInfo
IS
  TABLE OF USerinfo INDEX BY pls_integer;
  UserRecord UserInfo;
BEGIN
  LOOP
    usedate := add_months(usedate,-1);
    dbms_output.put_line(usedate);
    EXIT  WHEN usedate <= startdate;

    --Using usedate in select statement 

     SELECT * 
     BULK COLLECT    INTO UserRecord
    from (
          SELECT d.dt       ,
          fuel, --- This column is coming from another table
          SUM(revenue)      --- This column is coming from another table
     FROM
        ( SELECT ADD_MONTHS(TRUNC(usedate,'mm'),-ROWNUM + 1)-1 dt FROM dual
        ) d); --Make join with the table having columns in select query

      FOR i IN 1..UserRecord.count
      loop
       --Displaying records of select staement
       dbms_ouput.put_line(UserRecord(i).dt ||UserRecord(i).fuel || UserRecord(i).revnue);
      end loop;

  END LOOP;
END;

PS: не тестировалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...