当前位置: 代码迷 >> Oracle开发 >> 新手有关问题 求解答
  详细解决方案

新手有关问题 求解答

热度:159   发布时间:2016-04-24 06:23:17.0
新手问题 求解答
数据表:
编号   数量      日期       
 5        100      2015/11/01 
  5         100      2015/11/07
  5         100      2015/11/10  
  6         100      2015/11/01  
  6         100      2015/11/05
  6         -50      2015/11/10

需要结果
编号   数量      开始日期     结束日期       
  5       100            2015/11/01     2015/11/06
  5       200           2015/11/07      2015/11/09
  5      300           2015/11/10       2015/11/31
 6      100            2015/11/01       2015/11/04
 6      200           2015/11/05        2015/11/09
 6      150           2015/11/10        2015/11/31


结果的数量 是累加的  结束日期 是下一条数据的日期 减1
------解决思路----------------------
select 编号,
       sum(数量)over(partition by 编号 order by 日期) 数量 ,
        日期 开始日期,
       lead(to_char(to_date(日期,'yyyy/mm/dd')-1,'yyyy/mm/dd'),1,to_char(last_day(to_date(日期,'yyyy/mm/dd')),'yyyy/mm/dd'))over(partition by 编号 order by 日期) 结束日期
  from tab;

末尾的结束日期是当月的最后一天,感觉处理麻烦了。
另外,11月是小月,没有31
------解决思路----------------------
1楼的思路就可以~
------解决思路----------------------
--建表
create table cux_test20151116(
id varchar2(10),
num number,
date1 date
);
--插入数据

--解决sql
SELECT cux.id 编号
      ,SUM(cux.num) over(PARTITION BY cux.id ORDER BY cux.date1) 数量
      ,cux.date1 开始日期
      ,lead(cux.date1
           ,1
           ,last_day(cux.date1)) over(PARTITION BY cux.id ORDER BY cux.date1) 结束日期

  FROM cux_test20151116 cux
  相关解决方案