oracle 怎么根据自定义月份统计各月数据,例如每月结账时间为上月26号到本月25号,统计每月营业额

解决方案 »

  1.   

    对日期做处理,-25天调整为正常日期样式后再做处理
    with mon_yye 
    as
    (
    select to_date('20160125','yyyymmdd') date1,100 yye from dual union all 
    select to_date('20160126','yyyymmdd') ,200 from dual union all 
    select to_date('20160131','yyyymmdd') ,200 from dual union all 
    select to_date('20160225','yyyymmdd') ,300 from dual union all 
    select to_date('20160226','yyyymmdd') ,400 from dual union all 
    select to_date('20160227','yyyymmdd') ,500 from dual union all 
    select to_date('20160228','yyyymmdd') ,500 from dual union all 
    select to_date('20160229','yyyymmdd') ,500 from dual union all 
    select to_date('20160326','yyyymmdd') ,600 from dual )
    select to_char(add_months(a.date1 - 25, 1), 'YYYYMM') date2, sum(a.yye) yye
      from mon_yye a
     group by to_char(add_months(a.date1 - 25, 1), 'YYYYMM')
     order by to_char(add_months(a.date1 - 25, 1), 'YYYYMM')
      

  2.   

    oracle有个函数,add_months,指定日期增加月 
    select add_months(to_date('2017-01-25','yyyy-mm-dd'),1) from dual 
    返回2017-02-25按照你的需求,那就是统计日期  between to_date('2017-01-25','yyyy-mm-dd')  and add_months(to_date('2017-01-25','yyyy-mm-dd'),1)
      

  3.   

    借#1的数据一用with mon_yye 
    as
    (
    select to_date('20160125','yyyymmdd') date1,100 yye from dual union all 
    select to_date('20160126','yyyymmdd') ,200 from dual union all 
    select to_date('20160131','yyyymmdd') ,200 from dual union all 
    select to_date('20160225','yyyymmdd') ,300 from dual union all 
    select to_date('20160226','yyyymmdd') ,400 from dual union all 
    select to_date('20160227','yyyymmdd') ,500 from dual union all 
    select to_date('20160228','yyyymmdd') ,500 from dual union all 
    select to_date('20160229','yyyymmdd') ,500 from dual union all 
    select to_date('20160326','yyyymmdd') ,600 from dual )
    select  t.month_s,SUM(t.yye) from (
    select 
    case when a.date1 between a.date1 and add_months(a.date1,1)+1
    then to_char(add_months(a.date1,1),'YYYYMM') 
    end month_s   --如果时间在26到下月25区间内,则取出月份
    ,a.yye from mon_yye a) t
    group by t.month_s
    order by t.month_s;
      

  4.   

    不好意思,刚刚的逻辑有点问题,参考这个吧with mon_yye 
    as
    (
    select to_date('20160120','yyyymmdd') date1,100 yye from dual union all
    select to_date('20160125','yyyymmdd') date1,100  from dual union all 
    select to_date('20160126','yyyymmdd') ,200 from dual union all 
    select to_date('20160131','yyyymmdd') ,200 from dual union all 
    select to_date('20160225','yyyymmdd') ,300 from dual union all 
    select to_date('20160226','yyyymmdd') ,400 from dual union all 
    select to_date('20160227','yyyymmdd') ,500 from dual union all 
    select to_date('20160228','yyyymmdd') ,500 from dual union all 
    select to_date('20160229','yyyymmdd') ,500 from dual union all 
    select to_date('20160326','yyyymmdd') ,600 from dual )select t.months,sum(t.yye) from (
    select case when substr(to_char(a.date1,'YYYYMMDD'),7,2) >=26 then 
    to_char(add_months(a.date1,1),'YYYYMM') 
    else to_char(a.date1,'YYYYMM')  
    end months, --如果日期大于等于26则月份加1,反之保持不变
     substr(to_char(a.date1,'YYYYMMDD'),7,2)  ,a.date1,a.yye from  mon_yye a
    ) t 
    group by t.months
    order by t.months