Помогите с SQL-запросом

Samara123
Дата: 07.06.2006 20:29:11
Требуется, чтобы в одном запросе при вводе параметров даты1 и даты2 выводились данные типа:
дата1
0101годдаты1+1
0101годдаты1+2
0101годдаты1+3
........
дата2 - все упорядоченно
например:
дата1 = 05061998
дата2 = 17042001
вывод:
05061998
01011999
01012000
01012001
17042001
Можно с использованием PL/SQL, но в итоге по результату надо иметь возможность пробежаться курсором, то есть использовать Fetch.
Заранее, Спасибо.
dmidek
Дата: 07.06.2006 20:39:23
Делал быстро, надо убегать домой :)

select to_date('05061998','DDMMYYYY') datum
from dual
UNION ALL
select ADD_MONTHS(trunc(to_date('05061998','DDMMYYYY'),'YYYY'), 12*level) datum
from dual
connect by ADD_MONTHS(trunc(to_date('05061998','DDMMYYYY'),'YYYY'), 12*level) <=  to_date('17042001','DDMMYYYY')
UNION ALL
select to_date('17042001','DDMMYYYY') datum
from dual
order by 1

DATUM             
------------------
5-Jun-1998
1-Jan-1999
1-Jan-2000
1-Jan-2001
17-Apr-2001
M_IV
Дата: 08.06.2006 11:46:29
SELECT DISTINCT DATUM_1 ,  LEVEL , DECODE(LEVEL, 1, datum_1, ADD_MONTHS(TRUNC(datum_1,'YYYY'), 12*(LEVEL-1))) DATUM  FROM
(
            SELECT TO_DATE('05061998','DDMMYYYY') datum_1, TO_DATE('17042001','DDMMYYYY') datum_2 FROM dual
			UNION ALL
			SELECT TO_DATE('17042001','DDMMYYYY') datum_1, TO_DATE('17042001','DDMMYYYY') datum_2 FROM dual
)
CONNECT BY LEVEL <= MONTHS_BETWEEN(TRUNC(datum_2,'YYYY'), TRUNC(datum_1,'YYYY'))/12 + 1 ORDER BY DATUM_1, LEVEL

DATUM_1        LEVEL DATUM    
--------- ---------- ---------
05-JUN-98          1 05-JUN-98
05-JUN-98          2 01-JAN-99
05-JUN-98          3 01-JAN-00
05-JUN-98          4 01-JAN-01
17-APR-01          1 17-APR-01
Samara123
Дата: 09.06.2006 04:16:48
Всем Спасибо Огромное! Понял, что еще учиться и учиться. Не додумался бы до такого... :)
Samara123
Дата: 21.06.2006 18:02:30
К сожалению оба запорса не работают.
Первый выдает
The following error has occurred:
ORA-01436: CONNECT BY loop in user data
А второй
ORA-01472:Cannot use CONNECT BY on view with DISTINCT, GROUP BY, etc.
Как это можно исправить?
Samara123
Дата: 21.06.2006 18:04:33
Забыл добавить - Оракл 8.1.7, может в старших версиях.
Proteus
Дата: 21.06.2006 18:08:24
Samara123
К сожалению оба запорса не работают.
Первый выдает
The following error has occurred:
ORA-01436: CONNECT BY loop in user data
А второй
ORA-01472:Cannot use CONNECT BY on view with DISTINCT, GROUP BY, etc.
Как это можно исправить?

неправда твоя
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
Connected as dms


SQL> 
SELECT   TO_DATE ('05061998', 'DDMMYYYY') datum
    FROM DUAL
UNION ALL
SELECT     ADD_MONTHS (TRUNC (TO_DATE ('05061998', 'DDMMYYYY'), 'YYYY'),
                       12 * LEVEL
                      ) datum
      FROM DUAL
CONNECT BY ADD_MONTHS (TRUNC (TO_DATE ('05061998', 'DDMMYYYY'), 'YYYY'),
                       12 * LEVEL
                      ) <= TO_DATE ('17042001', 'DDMMYYYY')
UNION ALL
SELECT   TO_DATE ('17042001', 'DDMMYYYY') datum
    FROM DUAL
ORDER BY 1;

DATUM
-----------
05.06.98
01.01.99
01.01.00
01.01.01
17.04.01
SELECT DISTINCT datum_1, LEVEL,
                DECODE (LEVEL,
                        1, datum_1,
                        ADD_MONTHS (TRUNC (datum_1, 'YYYY'), 12 * (LEVEL - 1))
                       ) datum
           FROM (SELECT TO_DATE ('05061998', 'DDMMYYYY') datum_1,
                        TO_DATE ('17042001', 'DDMMYYYY') datum_2
                   FROM DUAL
                 UNION ALL
                 SELECT TO_DATE ('17042001', 'DDMMYYYY') datum_1,
                        TO_DATE ('17042001', 'DDMMYYYY') datum_2
                   FROM DUAL)
     CONNECT BY LEVEL <=
                       MONTHS_BETWEEN (TRUNC (datum_2, 'YYYY'),
                                       TRUNC (datum_1, 'YYYY')
                                      )
                     / 12
                   + 1
       ORDER BY datum_1, LEVEL;

DATUM_1          LEVEL DATUM
----------- ---------- -----------
05.06.98             1 05.06.98
05.06.98             2 01.01.99
05.06.98             3 01.01.00
05.06.98             4 01.01.01
17.04.01             1 17.04.01

как видиш работают... версия сервера и тексты запросов в студию.
Proteus
Дата: 21.06.2006 18:13:21
Samara123
Забыл добавить - Оракл 8.1.7, может в старших версиях.


если так то правда не работают... деревянные запросы не проходят...
Elic
Дата: 21.06.2006 18:31:37
Samara123
Оракл 8.1.7, Как это можно исправить?
Существует множество способов получения pivot-таблицы.
Jura_CZ
Дата: 21.06.2006 18:37:32
Oracle 8.1.7
Один из способов

select TAB.rn, 
	   (case when TAB.rn = 1 then TAB.be
	   		when TRUNC(ADD_MONTHS(TAB.be, TAB.rn * 12), 'yyyy') > TAB.en then TAB.en
			else TRUNC(ADD_MONTHS(TAB.be, TAB.rn * 12), 'yyyy')
			end) 
from 
(
select rownum rn, dd.* from 
(
select TO_DATE('12.3.2001', 'dd.mm.yyyy') as be, TO_DATE('30.12.2005', 'dd.mm.yyyy') as en from dual
) dd,
ALL_OBJECTS ab
where rownum < MONTHS_BETWEEN(dd.en, dd.be)/12 + 1
) TAB