2016-05-08 2 views
1

Я пытаюсь получить последние 6-месячные данные из Oracle. Я могу получить месяц данные, только если есть данные, Мое требование, чтобы получить все данные за шесть месяцев, если данных нет, то запрос должен вернуть месяц имя и значение 0.Получить последние данные за 6 месяцев, если данные недоступны, напечатайте имя месяца и 0

Ожидаемый результат

января 1000
февраля 0
марта 0
апреля 0
мая 1200

Получение результата
января 1000
мая 1200

Ниже приведен запрос, который я пытаюсь получить.

select 
    to_char(trunc(td.cre_on_date,'MON'), 
'Month', 
'nls_date_language=american') TDATE , 
coalesce(sum(td.amt),0) amt 
from trandetail td, tranheader th 
where th.batchid = td.batchid 
and td.status = 'FDSC' 
and td.ccy = 'USD' 
and th.pcid in (
    (select pty_id from bus_pty_hier bh 
    inner join bus_pty bp on bh.ASSOC_BUS_PTY_ID = BP.PTY_ID 
    START WITH PARNT_BUS_PTY_ID = 1 
    CONNECT BY PRIOR ASSOC_BUS_PTY_ID = PARNT_BUS_PTY_ID) 
    union select 1 from dual) 
and td.cre_on_date > trunc(sysdate-180) 
GROUP BY trunc(td.cre_on_date,'MON') 
ORDER BY trunc(td.cre_on_date,'MON') asc 

ответ

4

Вы не можете получить другие четыре месяца из данных, потому что их не существует. Вам нужно создать список потенциальных месяцев, а затем внешнее соединение с вашими данными. Что-то вроде (непроверенные):

with months (month) as (
    select add_months(trunc(sysdate, 'MM'), -1 * (level - 1)) 
    from dual 
    connect by level <= 6 
) 
select to_char(m.month, 'Month', 'nls_date_language=american') TDATE, 
    coalesce(sum(t.amt),0) amt 
from months m 
left join (
    select trunc(td.cre_on_dt, 'MM') as month, td.amt 
    from trandetail td 
    inner join tranheader th 
    on th.batchid = td.batchid 
    where td.status = 'FDSC' 
    and td.ccy = 'USD' 
    and th.pcid in (
    select pty_id 
    from bus_pty_hier bh 
    inner join bus_pty bp 
    on bh.ASSOC_BUS_PTY_ID = BP.PTY_ID 
    START WITH PARNT_BUS_PTY_ID = 1 
    CONNECT BY PRIOR ASSOC_BUS_PTY_ID = PARNT_BUS_PTY_ID 
    union select 1 from dual 
) 
    and td.cre_on_date >= add_mknths(trunc(sysdate), -6) -- maybe trunc MM again 
) t 
on t.month = m.month 
GROUP BY m.month 
ORDER BY m.mknth 

months КТР дает в первый день каждого из последних шести месяцев. Я по существу сделал большую часть вашего первоначального запроса в встроенном представлении (но это может быть другой CTE), потому что он имеет свои собственные соединения, но вы, вероятно, можете распутать это, так что это отправная точка. Из этого встроенного представления вы получаете месяц и сумму от каждой транзакции, а внешние - к основному списку матов до того, как будут выполнены агрегирование и объединение.

+0

Спасибо Alex за вашу помощь, теперь я получаю ошибку '' ORA-00904: «TD». «AMT»: неверный идентификатор. Не могли бы вы помочь решить эту проблему? – user1127643

+0

@ user1127643 - ну, я сказал, что он непроверен * 8-) Я не изменил псевдоним таблицы в сумме. Обновлено. –

+0

Привет, Алекс Спасибо ... Его работа сейчас. – user1127643

Смежные вопросы