2015-06-17 4 views
1

I имеют следующие результаты запросов Oracle SQL:SQL Заполните пустой запрос с 0 на основе диапазона дат

TDATE OPEN Closed 19/05/15 1 1 20/05/15 0 1 26/05/15 2 0 27/05/15 1 0 28/05/15 2 0

Например, я хотел бы запросить от 19 - 30 мая.

И результаты я хотел бы получить это:

TDATE OPEN Closed 19/05/15 1 1 20/05/15 0 1 21/05/15 0 0 22/05/15 0 0 23/05/15 0 0 24/05/15 0 0 25/05/15 0 0 26/05/15 2 0 27/05/15 1 0 28/05/15 2 0 29/05/15 0 0 30/05/15 0 0

Если запрос находится в пределах диапазона дат и записей, которые не существуют, будут возвращены как 0 и 0 для открытых и закрытых.

Любая помощь будет оценена по достоинству.

+1

Вы должны налево присоединиться с календарным столом (или cte). SO полна примеров того, как это сделать, просто выполните поиск. Также, Добро пожаловать в stackoverflow. Пожалуйста, прочитайте [ask]. –

ответ

1

Пустая таблица с нулями и все даты могут быть сделаны как

INSERT INTO empytable 
(SELECT TRUNC(@firstdat + (ROWNUM - 1)) dat, 0, 0 
FROM DUAL CONNECT BY ROWNUM <= @days) 

Затем вы можете загрузить свои результаты в этой таблице, или объединить их в противном случае. Заполнитель firstdat должен быть датой для добавления в работу.

0

В Oracle, используя КТР,

WITH table_ (TDATE, OPEN, Closed) AS (
SELECT to_date('19/05/15', 'dd/mm/yy'), 1, 1 from dual UNION ALL 
SELECT to_date('20/05/15', 'dd/mm/yy'), 0, 1 from dual UNION ALL 
SELECT to_date('26/05/15', 'dd/mm/yy'), 2, 0 from dual UNION ALL 
SELECT to_date('27/05/15', 'dd/mm/yy'), 1, 0 from dual UNION ALL 
SELECT to_date('28/05/15', 'dd/mm/yy'), 2, 0 from dual), 
-------------- 
-- End of data preparation 
-------------- 
arr_table as (
select to_date('19/05/15', 'dd/mm/yy') + level - 1 dummy_date 
    from dual 
connect by ROWNUM < = to_date('28/05/15', 'dd/mm/yy') - to_date('19/05/15', 'dd/mm/yy') + 1) 
SELECT a.dummy_date, COALESCE(b.open, 0) AS OPEN, COALESCE(b.closed, 0) AS closed 
    FROM arr_table a 
    LEFT OUTER JOIN table_ b 
    ON b.tdate = a.dummy_date 
ORDER BY a.dummy_date; 

Выход:

|   DUMMY_DATE | OPEN | CLOSED | 
|-----------------------|------|--------| 
| May, 19 2015 00:00:00 | 1 |  1 | 
| May, 20 2015 00:00:00 | 0 |  1 | 
| May, 21 2015 00:00:00 | 0 |  0 | 
| May, 22 2015 00:00:00 | 0 |  0 | 
| May, 23 2015 00:00:00 | 0 |  0 | 
| May, 24 2015 00:00:00 | 0 |  0 | 
| May, 25 2015 00:00:00 | 0 |  0 | 
| May, 26 2015 00:00:00 | 2 |  0 | 
| May, 27 2015 00:00:00 | 1 |  0 | 
| May, 28 2015 00:00:00 | 2 |  0 | 

Так в основном, запрос будет:

with arr_table as (
    select to_date(<start_date>, 'dd/mm/yy') + level - 1 dummy_date 
     from dual 
    connect by ROWNUM < = to_date(<end_date>, 'dd/mm/yy') - to_date(<start_date>, 'dd/mm/yy') + 1) 
    SELECT a.dummy_date, COALESCE(b.open, 0) AS OPEN, COALESCE(b.closed, 0) AS closed 
     FROM arr_table a 
     LEFT OUTER JOIN <your_table> b 
     ON b.tdate = a.dummy_date 
    ORDER BY a.dummy_date; 
Смежные вопросы