小妹我遇到一个棘手的问题,在使用lag函数计算年增长率时,去年的数据是空,也就是没有销售,前年是有数的,lag在计算的时候,会用前年的数来计算,结果当然是错误的,这个问题如何解决?
举例:
Prod Year Sales
A 2006 100
A 2008 200
在计算A产品2008年的增长率时,用的是2006年的数,因为2007年A产品的Sales为0,数据库中没有2007年的记录,这个问题怎么解决?
先谢谢大家了!

解决方案 »

  1.   

    union
    select prod,year,null from tab where year not in ...用这个表去就行了
      

  2.   

    不知到你的sql怎么写的,提个建议把
    select to_char(add_months(to_date('2006','yyyy'),12*rownum),'yyyy')
    from dual
    connect by rownum < 2008-2006把他作为一个子表,和你的外观连。然后对关联后的表进行lag的统计
      

  3.   

    对于去年没有数据的,growth为空。
      

  4.   

    select t3.year,nvl(t4.Sales,0) sales
    from  (select t2.startYear + rownum - 1 year
           from (select max(year)-min(year)+1 num, min(year) startYear from t1) t2,
                 all_objects
           where rownum <= t2.num) t3,
          t1 t4
    where t3.year = t4.year(+);假设这个表的名字是T1
      

  5.   

    如果不确定哪个年份没数据,可以创建一个存放全部年份的表b,如从1900-2020
    若原表为A
    select prod,year,sales,sales/lag(sales)over(order by year)-1 growth from(
    select prod,year,sales from a
    union 
    select 'A',year,null from b where year between(1990,2009) and year not in 
      (select year from a))
      

  6.   

    我原来是这样写的:select prod,year,(Sales/lag(Sales,1) OVER (PARTITION BY prod order by prod,year)-1) as Growth_Rate我的产品数很多,而且不知道中间哪一年会没数,不用的产品也是不一样的情况啊。
      

  7.   

    你还是能应用程序或者是存储过程来解决这个问题吧,你的数据中有可能存有某些用户缺好几年的数据的情况,这样,就算能用一个SQL语句来完成,恐怕也是没人看得明白了,这是写程序的大忌之一。你如果用存储过程或者应用程序来写,可以写得简单明了,同时,效率还往往会更高
      

  8.   

    后面的where 语句怎么写啊?又不确定少了哪一年?
      

  9.   

    那就加个条件呗
    最后一行改成
    select year fom a where sales is not null
      

  10.   

    a 表中sales 都是not null
      

  11.   

    自己想了一个办法:
    select prod, year,case when (lag(year) over (order by year))= year-1  then (sales/lag(sales) over (order by year)-1)
    else null
    end as Growth_Rate
    from table1
      

  12.   

    结贴给分,谢谢大家对我的启发!
    尤其是 wildwave 和 majy