【问题标题】:Oracle SQL: join a table of dates with different IDsOracle SQL:加入具有不同 ID 的日期表
【发布时间】:2014-08-10 08:04:32
【问题描述】:

这是我的数据示例:

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 的观察结果为空,并且未按我的意愿添加帐户 0000000133。

我该如何解决这个问题?

谢谢!

【问题讨论】:

  • 那么您使用的查询是什么?如果没有实际代码,很难解决您的代码问题......外部连接应该足以获得您描述的结果集。拥有您想要的结果集的表示也会很有用。
  • 复制什么账号?如果它不在原始表中,则没有帐户 ID 对吗?
  • ACCT_ID 在另一个表中吗?如果是这样,为什么不将ACCT_ID 添加到On 子句中?

标签: sql oracle join oracle-sqldeveloper


【解决方案1】:

假设您至少在 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

【讨论】:

    【解决方案2】:

    收集所有唯一帐户,将它们加入到结束日期以获取所有唯一行,然后收集金额:

    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
    

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

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多