表结构如下:
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页面上取,怎样根据页面日期,计算在此日期段内工资总额(根据页面日期判断工资总额有无变化,有,则分开计算,无,则乘以月份数即可)。
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页面上取,怎样根据页面日期,计算在此日期段内工资总额(根据页面日期判断工资总额有无变化,有,则分开计算,无,则乘以月份数即可)。
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;
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来代替你的日期中的月份 你自己改一下!
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来代替你的日期中的月份 你自己改一下!
谢谢大家的关注,我在继续
你好,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的数据列吗?还是实现递归功能?