我试图从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!");
答案 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),因为它有自己的连接,但你可以解开它,所以这真的是一个起点。从该内联视图中,您可以获得每个事务的月份和金额,并且在聚合和合并完成之前,这些是外部加入到主列表中。