Oracle SQL проходит через те же данные и основывает их на текущей дате

Я пытаюсь выбрать одни и те же данные несколько раз с оракулом SQL на основе даты.

Например, на данный момент я написал этот SQL-запрос, чтобы вычислить мой баланс на текущую дату:

select to_char(sysdate, 'DD-MM-YYYY') date,
(
select (   
            select NVL(sum(bedrag), 0) bedrag
                from transactie 
                where rekening_naar_id = r.id
                and datum <= sysdate
                and actief = 1

        )  
        -  
        (
            select NVL(sum(bedrag), 0) bedrag
                from transactie 
                where rekening_van_id = r.id
                and datum <= sysdate
                and actief = 1
        ) 
    from dual     
    ) 
as balance
from rekening r
where r.id = 2; 

Мне было интересно, возможно ли зацикливать те же самые данные несколько раз в одном запросе SQL и выбирать несколько строк, просто увеличивая дату на 1 день каждый раз? Баланс меняется в зависимости от даты, отображаемой на графике.

Я не могу использовать PL/SQL для этого запроса, потому что мне нужно заполнить данные в диаграмме Apex Oracle, и нет возможности использовать PL/SQL для создания диаграммы. Разрешен только действительный запрос SQL или код PL/SQL, который возвращает действительный запрос SQL.

1 ответ

Решение

Когда вы думаете "цикл в Oracle SQL", подумайте connect by level,

Этот пример уходит на 30 дней в будущее.

select d.date1,
(
select (   
            select NVL(sum(bedrag), 0) bedrag
                from transactie 
                where rekening_naar_id = r.id
                and datum <= d.date1
                and actief = 1

        )  
        -  
        (
            select NVL(sum(bedrag), 0) bedrag
                from transactie 
                where rekening_van_id = r.id
                and datum <= d.date1
                and actief = 1
        ) 
    from dual     
    ) 
as balance
from rekening r
cross join (select trunc(sysdate+(level-1)) as date1
    from dual
    connect by level < 31) d
where r.id = 2; 

http://sqlfiddle.com/

Перекрестное соединение такое же, как равнина join my_table без условий присоединения, или join my_table on 1=1, Возвращает все комбинации строк в обеих таблицах. В этом случае он возвращает все комбинации строк в rekening со строками во встроенном представлении с именем d (который содержит даты на следующие 30 дней). Попробуйте запустить d просмотр оператора select сам по себе, чтобы увидеть, что он делает.

select trunc(sysdate+(level-1)) as date1
from dual
connect by level < 31;

Соединение по уровню является частным случаем иерархической connect by пункт. Он генерирует последовательность строк / чисел, что может быть очень полезно. Вот очень простой пример:

select level from dual connect by level < 10;
Другие вопросы по тегам