给出这样一张表,得到结果如下:
2003 2
2004 3
2005 12
2006 12
2007 12
2008 12
2009 12
2010 22
就是把缺的年份补上,怎么实现?

解决方案 »

  1.   

    with
    t as (select 2003 year,2 sum from dual union all 
    select 2004 year,3 sum from dual union all 
    select 2005 year,12 sum from dual union all 
    select 2010 year,22 sum from dual)
    select t2.year,sum
    from (select start_year+level-1 year
          from (select min(year)start_year,max(year)end_year from t) t1
          connect by level<=end_year-start_year+1)t2,t
    where t2.year=t.year(+)
    order by year;
      

  2.   

    楼上的方法是最简单的,
    再给楼主提供一个稍微复杂的:
    create table t(year varchar2(10),sum number)
    insert into t values('1999','1');
    insert into t values('2003','2');
    insert into t values('2004','3');
    insert into t values('2005','4');
    insert into t values('2010','5');select *
      from (select year,sum
              from t
            union all
            select year - level || '' year, sum
              from (select year,
                           lag(year, 1) over(order by year) + 1 s,
                           year - 1 e,
                           lag(sum) over(order by year) sum
                      from t)
             where e - s = 0
                or e - s > 1
            connect by prior year = year
                   and level <= e - s + 1
                   and prior dbms_random.value is not null)
     order by 1;