获取最近6个月的数据,如果数据不可用,则打印monthname和0

时间:2016-05-08 18:54:53

标签: oracle oracle10g

我试图从oracle DB获取最近6个月的数据。我只能在数据存在的情况下得到月份数据,我的要求是获取所有六个月的数据,如果数据不存在则查询应该返回月份名称和值0。

预期结果

1月1000日 2月0日 3月0日 4月0日 5月1200日

获得结果
1月1000日 5月1200日

以下是我试图获得此问题的查询。

else if (age >= 2 && age <=3){
    System.out.println("You're a toddler!");

1 个答案:

答案 0 :(得分: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给出了过去六个月中每一天的第一天。我基本上将你的原始查询的大部分内容都放到了一个内联视图中(但它可能是另一个CTE),因为它有自己的连接,但你可以解开它,所以这真的是一个起点。从该内联视图中,您可以获得每个事务的月份和金额,并且在聚合和合并完成之前,这些是外部加入到主列表中。