Oracle SQL:使用不同的ID连接日期表

时间:2014-06-19 17:08:21

标签: sql oracle join oracle-sqldeveloper

以下是我的数据示例:

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未按我的意愿添加。

如何解决此问题?

谢谢!

2 个答案:

答案 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

此查询效率不高,但如果表格大小很小,那么希望它的运行速度足以满足您的需求。