一张表,但是需要根据选择的月份进行(最近3,6,9,12个月)统计和同比显示,想问问大神要怎么写
SELECT rq "月份", ((value - old_sum) / old_sum * 100||'%') "同比",value "总数" from 
(
select to_char(y.crjsj,'YYYYMM') as rq,count(1) as value,(select count(1) as value from yw_t_jy y1 where to_char(y1.crjsj,'YYYYMM')>=to_char(add_months(TO_DATE (start, 'YYYYMM'),-12),'YYYYMM') and to_char(y1.crjsj,'YYYYMM')<=to_char(add_months(TO_DATE (end, 'yyyymm'),-12),'YYYYMM') and y1.fxqd=0 
group by to_char(y1.crjsj,'YYYYMM')) old_sum from yw_t_jy y where to_char(y.crjsj,'YYYYMM')>=start and to_char(y.crjsj,'YYYYMM')<=end and y.fxqd=0 
group by to_char(y.crjsj,'YYYYMM') order by rq
)
这是我写的,如果只有一个月还能计算,但是多个月就没办法弄了,一直提示单个子查询返回多个行

解决方案 »

  1.   

    楼主,研究一下 lag 和 lead 这两个函数,比较适合你现在的需求;
      

  2.   

    问题出在这个子查询上面:
    select count(1) as value from yw_t_jy y1 where to_char(y1.crjsj,'YYYYMM')>=to_char(add_months(TO_DATE (start, 'YYYYMM'),-12),'YYYYMM') and to_char(y1.crjsj,'YYYYMM')<=to_char(add_months(TO_DATE (end, 'yyyymm'),-12),'YYYYMM') and y1.fxqd=0 
    group by to_char(y1.crjsj,'YYYYMM')    这里会返回多个结果集,
    环比应该可以用add_months(-12)实现
    同比应该可以用lag(1)取前一行实现