首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

怎么将某一时间段的记录分解成多条

2012-02-23 
如何将某一时间段的记录分解成多条?有这样一个表(table1),里面的记录如下xmmckssjjssjdliang项目12007-01-

如何将某一时间段的记录分解成多条?
有这样一个表(table1),里面的记录如下
xmmc                 kssj                               jssj                   dliang
项目1           2007-01-01                 2007-03-31               300
项目2           2007-02-01                 2007-05-31             1000
我现在要上面的记录按月份分解,将这个时间范围内的总的电量按月平均,也就是说这个时间段内有多少个月,那我下面这个表的平均电量(yuedliang)就为这个时间段的总电量除于算出来的月的数量,结果如下:
xmmc                 kssj                               jssj                     yuefen                     yuedliang
项目1           2007-01-01                 2007-07-31             2007-01                           100
项目1           2007-01-01                 2007-07-31             2007-02                           100
项目1           2007-01-01                 2007-07-31             2007-03                           100
项目2           2007-02-01                 2007-05-31             2007-02                           200
项目2           2007-02-01                 2007-05-31             2007-03                           200
项目2           2007-02-01                 2007-05-31             2007-04                           200
项目2           2007-02-01                 2007-05-31             2007-05                           200


不知道用sql语句能否实现,不行写个存储过程也ok,多谢了,在线等!



[解决办法]
我测试是可以的,你试试看~~~

========================第一种========================

SQL> select tt.xmmc,
2 add_months(tt.kssj,rr-1) as kssj,
3 decode(sign(add_months(tt.kssj,rr)-tt.jssj),1,tt.jssj,add_months(tt.kssj,rr)) as jssj,
4 round(tt.dliang/(to_number(months_between(tt.jssj+1,tt.kssj)))) as avg_dliang
5 from (
6 select '项目1 ' as xmmc,to_date( '2007-01-01 ', 'yyyy-mm-dd ') as kssj,to_date( '2007-03-31 ', 'yyyy-mm-dd ') as jssj,300 as dliang from dual
7 union all


8 select '项目2 ' as xmmc,to_date( '2007-02-01 ', 'yyyy-mm-dd ') as kssj,to_date( '2007-05-31 ', 'yyyy-mm-dd ') as jssj,1000 as dliang from dual
9 )tt,
10 (
11 select rownum rr from all_objects where rownum <1000
12 )
13 where add_months(tt.kssj,rr)-(tt.jssj+1) <=0;

XMMC KSSJ JSSJ AVG_DLIANG
--------- ----------- ----------- ----------
项目1 1/1/2007 2/1/2007 100
项目1 2/1/2007 3/1/2007 100
项目1 3/1/2007 3/31/2007 100
项目2 2/1/2007 3/1/2007 250
项目2 3/1/2007 4/1/2007 250
项目2 4/1/2007 5/1/2007 250
项目2 5/1/2007 5/31/2007 250

7 rows selected


==========================第二种==================

SQL> select tt.xmmc,
2 tt.kssj,
3 tt.jssj,
4 to_char(decode(sign(add_months(tt.kssj,rr)-tt.jssj),1,tt.jssj,add_months(tt.kssj,rr-1)), 'yyyy-mm ') as jssj,
5 round(tt.dliang/(to_number(months_between(tt.jssj+1,tt.kssj)))) as avg_dliang
6 from (
7 select '项目1 ' as xmmc,to_date( '2007-01-01 ', 'yyyy-mm-dd ') as kssj,to_date( '2007-03-31 ', 'yyyy-mm-dd ') as jssj,300 as dliang from dual
8 union all
9 select '项目2 ' as xmmc,to_date( '2007-02-01 ', 'yyyy-mm-dd ') as kssj,to_date( '2007-05-31 ', 'yyyy-mm-dd ') as jssj,1000 as dliang from dual
10 )tt,
11 (
12 select rownum rr from all_objects where rownum <1000
13 )
14 where add_months(tt.kssj,rr)-(tt.jssj+1) <=0;

XMMC KSSJ JSSJ JSSJ AVG_DLIANG
--------- ----------- ----------- ------- ----------
项目1 1/1/2007 3/31/2007 2007-01 100
项目1 1/1/2007 3/31/2007 2007-02 100
项目1 1/1/2007 3/31/2007 2007-03 100
项目2 2/1/2007 5/31/2007 2007-02 250
项目2 2/1/2007 5/31/2007 2007-03 250
项目2 2/1/2007 5/31/2007 2007-04 250
项目2 2/1/2007 5/31/2007 2007-05 250

7 rows selected

热点排行