在Oracle SQL中创建虚拟记录

时间:2015-05-29 08:28:22

标签: sql oracle

我需要使用先前记录中的值为给定日期范围创建空记录。 例如,假设我有包含以下列的表 - 数据和余额,数据如下 -

05/05/2015 - 500
09/05/2015 - 700

现在,我想显示日期01/05/2015至2015年5月10日的记录,如下所示

01/05/2015 - 0
02/05/2015 - 0
03/05/2015 - 0
04/05/2015 - 0
05/05/2015 - 500
06/05/2015 - 500
07/05/2015 - 500
08/05/2015 - 500
09/05/2015 - 700
10/05/2015 - 700

oracle中是否有任何分析函数或计算该类记录集的任何技巧? 请建议。

1 个答案:

答案 0 :(得分:1)

您可以使用分层查询生成数据范围,然后使用表格进行OUTER JOIN。 然后使用SUM分析函数获取每个日期的最新值。

SQL Fiddle

Oracle 11g R2架构设置

create table myt(
  date_ date,
  balance_ number
  );

 insert into myt values(date'2015-05-05',500);
 insert into myt values(date'2015-05-09',700);

查询1

with date_list(dates_) as (
  select date'2015-05-01' + level - 1
  from dual
  connect by date'2015-05-01' + level - 1 <= date'2015-05-10'
)
select date_list.dates_, myt.balance_, 
coalesce(last_value(myt.balance_) ignore nulls over (order by date_list.dates_),0) balance2,
sum(coalesce(myt.balance_,0)) over (order by date_list.dates_) balance3
from date_list left outer join myt
on date_list.dates_ = myt.date_
order by date_list.dates_

<强> Results

|                DATES_ | BALANCE_ | BALANCE2 | BALANCE3 |
|-----------------------|----------|----------|----------|
| May, 01 2015 00:00:00 |   (null) |        0 |        0 |
| May, 02 2015 00:00:00 |   (null) |        0 |        0 |
| May, 03 2015 00:00:00 |   (null) |        0 |        0 |
| May, 04 2015 00:00:00 |   (null) |        0 |        0 |
| May, 05 2015 00:00:00 |      500 |      500 |      500 |
| May, 06 2015 00:00:00 |   (null) |      500 |      500 |
| May, 07 2015 00:00:00 |   (null) |      500 |      500 |
| May, 08 2015 00:00:00 |   (null) |      500 |      500 |
| May, 09 2015 00:00:00 |      700 |      700 |     1200 |
| May, 10 2015 00:00:00 |   (null) |      700 |     1200 |