表结构如下:
dwgzxx(单位工资信息表)
 orgid           dwgzze           rq
单位编号      单位工资总额       日期
 10001           5386600       2011-1-1
 10026         7162808.333     2011-1-1
 10026         4163858         2011-4-1
 10027         1919183.333     2011-1-1
其中:单位工资总额表示各单位每个月的工资总额,有的单位一年定一次,也有的单位一年定两次(最多定两次)。
问题举例:以10026为例,
要统计1月份该单位的工资总额,则是:7162808.333;
要统计4月份该单位的工资总额,则是:4163858
要统计1-3月份该单位的工资总额,则是:3*7162808.333
要统计4-5月份该单位的工资总额,则是:2*4163858
要统计1-5月份该单位的工资总额,则是:3*7162808.333+2*4163858
我的目的:
统计所有单位1-10月份的工资总额,如果工资总额变两次的,则分开算,如果没变的则是:10*单位工资总额,日期在js页面上取,怎样根据页面日期,计算在此日期段内工资总额(根据页面日期判断工资总额有无变化,有,则分开计算,无,则乘以月份数即可)。

解决方案 »

  1.   

    ,分也太少了吧!好歹可以解决工作问题!及时结贴啊!--构建一张月份信息表
    create table monthinfo
    (
      oc_month number(10) --数字型便于比较
    );
    create table dwgzxx
    (orgid number(10)
     ,dwgzze  number(20,3)
     ,rq varchar2(10)
     ,oc_month number(10) --构建该字段用于关联
    );
    delete from monthinfo;
    insert into monthinfo
          select 201101 from dual
    union select 201102 from dual
    union select 201103 from dual
    union select 201104 from dual
    union select 201105 from dual
    union select 201106 from dual
    union select 201107 from dual
    union select 201108 from dual
    union select 201109 from dual
    union select 201110 from dual
    union select 201111 from dual
    union select 201112 from dual
    ;
    commit;
    insert into dwgzxx
           select  10001, 5386600 ,'2011-1-1',201101 from dual
    union select  10026, 7162808.333 ,'2011-1-1',201101 from dual
    union select  10026, 4163858 ,'2011-4-1',201104 from dual
    union select  10027, 1919183 ,'2011-1-1',201101 from dual
    ;
    commit;---这个视图很关键,索引也很重要
    create or replace view vdwgzxx
    as
    select d.oc_month,d.orgid,c.dwgzze,c.oc_month as real_month from dwgzxx c,(
    select b.oc_month,a.orgid,max(a.oc_month) as data_month from dwgzxx a,monthinfo b
    where b.oc_month >= a.oc_month
    group by b.oc_month,a.orgid) d
    where c.oc_month = d.data_month
      and c.orgid = d.orgid;---1月份
    select sum(a.dwgzze) from vdwgzxx a
    where a.orgid = '10026'
    and a.oc_month between 201101 and 201101;
      

  2.   

    WITH t
    AS 
    (
    SELECT 10026 a,7162808.333 b, 1 c FROM dual
    UNION ALL
    SELECT 10026,4163858,4 FROM dual
    UNION ALL
    SELECT 10026,1020020,8 FROM dual
    )
    SELECT SUM(B) FROM 
    (
    SELECT a,b,c,rn,row_number()over(PARTITION BY rn ORDER BY c DESC)rm
    FROM
    (
    SELECT * FROM t,(SELECT ROWNUM  rn FROM dual CONNECT BY ROWNUM<10)
    WHERE t.c<=rn
    ))
    WHERE rm=1 AND rn BETWEEN 1 AND 5
    --这里的rn就是你的题目中的月份,我现在取的就是4-5月份!--result:
    8327716      =2*4163858
    1-5
    --result
    29816140.999 =3*7162808.333 +2*4163858
    --PASS
    --我为了省事,没有用日期,而是用1-5来代替你的日期中的月份 你自己改一下!
      

  3.   

    WITH t
    AS 
    (
    SELECT 10026 a,7162808.333 b, 1 c FROM dual
    UNION ALL
    SELECT 10026,4163858,4 FROM dual
    UNION ALL
    SELECT 10026,1020020,8 FROM dual
    )
    SELECT SUM(B) FROM 
    (
      SELECT a,b,c,rn,row_number()over(PARTITION BY rn ORDER BY c DESC)rm
      FROM
          (
                SELECT * FROM t,(SELECT ROWNUM  rn FROM dual CONNECT BY ROWNUM<10)
                WHERE t.c<=rn
          )
    )
    WHERE rm=1 AND rn BETWEEN 1 AND 3--这里的rn就是你的题目中的月份,我现在取的就是4-5月份!--result:
    8327716 =2*4163858
    1-5
    --result
    29816140.999 =3*7162808.333 +2*4163858
    --PASS
    --我为了省事,没有用日期,而是用1-5来代替你的日期中的月份 你自己改一下!
      

  4.   

    查了一下午,终于把oracle中统计函数row_number() over弄明白了些,接下来,在学习connect by()
    谢谢大家的关注,我在继续
      

  5.   


    你好,cosio
    能不能给我解释一下以下代码:
    SELECT sum(b) FROM 
    (
      SELECT a,b,c,rn,row_number()over(PARTITION BY rn ORDER BY c DESC)rm--排名
      FROM
          (
                SELECT * FROM t,(SELECT ROWNUM  rn FROM dual CONNECT BY ROWNUM<10)
                WHERE t.c<=rn--月份小于10
          )
    )我不懂的地方:
    1、上面的代码是如何实现根据月份的不同,选择b不同?
    2、row_number()over(PARTITION BY rn ORDER BY c DESC) 我的理解是:以rn分组,再按c升序时行排名。但是这条代码的真正功能是什么?(有什么用?)
    3、SELECT ROWNUM  rn FROM dual CONNECT BY ROWNUM<10 这段代码,仅仅是为了实现建一个1-10的数据列吗?还是实现递归功能?