Powielenie wierszy z inkrementacją jednej kolumny

0

Cześć, mam problem. Proszę o podpowiedzi.

Mam następującą tabelę:

ID CENA DATA OKRES
1 20 2015-07-05 3
2 15 2016-02-01 2

Chciałbym powielić każdy z wierszy tyle razy ile wynosi OKRES zmieniając, w każdym wierszu tylko DATĘ o jeden miesiąc.

Tabela wynikowa:

ID CENA DATA OKRES
1 20 2015-07-05 3
1 20 2015-08-05 3
1 20 2015-09-05 3
2 15 2016-02-01 2
2 15 2016-03-01 2

W jaki sposób mogę zrobić coś takiego?

0

procedurą

0
WITH TAB(ID,CENA,DATA,OKRES) AS (
  SELECT 1,20,TO_DATE('2015/07/05'),3 
    FROM DUAL 
  UNION ALL
  SELECT 2,15,TO_DATE('2016/02/01'),2 
    FROM DUAL),
TAB2 (ID,CENA,DATA,OKRES, RCOUNT) AS
  (SELECT ID,CENA,DATA,OKRES, COUNT(*) OVER(PARTITION BY ID) AS RCOUNT 
     FROM TAB),
REC_TAB(ID,CENA,DATA,OKRES, RCOUNT) AS
  (SELECT ID, CENA, ADD_MONTHS(DATA, 1), OKRES, RCOUNT 
     FROM TAB2
  UNION ALL
  SELECT ID, CENA, ADD_MONTHS(DATA, 1), OKRES, RCOUNT+1 
    FROM REC_TAB
   WHERE OKRES > RCOUNT)

SELECT * FROM REC_TAB ORDER BY ID, DATA;

Masz tu select, w zawartość wirtualnej tablicy "tab" napisz zamiast selectów z unionem, select do swojej tablicy. Mam nadzieje że pomoże. Chociaż przemyślał bym konstrukcje twojej tablicy, bo z tego co podałeś nie masz ani 1 unikatowego pola

0

Na szybko:

WITH q (l, id) AS
        (SELECT 1, 0 id FROM DUAL
          UNION ALL
         SELECT l + 1, 0 id
           FROM q
          WHERE l < (select sum(okres) from tab)
        )
SELECT q.* FROM q
/

1 użytkowników online, w tym zalogowanych: 0, gości: 1