以下是我的数据示例:
DATES ACCT_ID AMT
31-JAN-13 0000000117 137.6
31-MAY-13 0000000117 245.96
30-JUN-13 0000000117 8162.97
31-JUL-13 0000000117 158.85
31-OCT-13 0000000117 55.44
30-NOV-13 0000000117 0
31-JAN-14 0000000117 485.78
28-FEB-14 0000000117 588.28
31-MAR-14 0000000117 2315.56
31-JAN-13 0000000133 8291.45
30-APR-13 0000000133 21241.54
31-JUL-13 0000000133 22185.75
31-AUG-13 0000000133 19770.89
30-NOV-13 0000000133 15168.48
31-DEC-13 0000000133 11376.65
28-FEB-14 0000000133 11910.58
31-MAR-14 0000000133 8893.84
30-APR-14 0000000133 12093.9
我想要做的是将此表与2年期间所有月结束日期的表格连接起来。即:
DATES
31-JAN-13
28-FEB-13
31-MAR-13
30-APR-13
31-MAY-13
30-JUN-13
31-JUL-13
31-AUG-13
30-SEP-13
31-OCT-13
30-NOV-13
31-DEC-13
31-JAN-14
31-JAN-14
28-FEB-14
31-MAR-14
30-APR-14
对于原始表中没有值的每个日期,我想在结果中显示它,复制ACCT_ID,并让AMT为null
。
例如,我想:
31-JAN-13 0000000117 137.6
28-FEB-13 0000000117 null
31-MAR-13 0000000117 null
30-APR-13 0000000117 null
31-MAY-13 0000000117 245.96
......
我当前代码的简化版本是:
select * from table_amt
right join table_dates
using (acct_id)
order by (dates)
但是,简单的右连接不起作用,因为我在不同的帐户中执行join
。例如,请注意帐户0000000117在31-MAY-13上有记录,但0000000133没有记录,在我的结果中,日期为31-MAY-13的空观察和帐户0000000133未按我的意愿添加。
如何解决此问题?
谢谢!
答案 0 :(得分:2)
假设您至少使用10g,则可以使用分区外连接:
select dt.dates, d.acct_id, d.amt
from table_dates dt
left outer join table_amt d partition by (acct_id)
on d.dates = dt.dates
order by d.acct_id, to_date(dt.dates);
有关此方法的更多信息,请阅读:http://docs.oracle.com/cd/E11882_01/server.112/e25555/tdpdw_sql.htm#TDPDW00721
答案 1 :(得分:0)
收集所有唯一帐户,将它们加入到结束日期以获取所有唯一行,然后收集金额:
select m.date,
a.acct_id,
(select sum(table_amt.amt)
from table_amt
where table_amt.date = m.date
and table_amt.acct_id = a.acct_id) as amt
from table_dates m,
(select distinct acct_id from table_amt) a
此查询效率不高,但如果表格大小很小,那么希望它的运行速度足以满足您的需求。