暂无图片
请教这个SQL(关于model)
我来答
分享
刘晓华
2024-05-09
请教这个SQL(关于model)
暂无图片 50M

如下图:model_test表emid,year1,S,A四个字段分别代表工号,年份,应有年假,已请年假

R列代表当前剩余的年假天数,需用model计算,现也计算出来了,公式如下:

R=上一行的R值+当前行的S值-当前行的A值

但我要在这个基础上进一步处理:同一个工号同一年份可能有两条或多条记录(一年分两段计算),如果当前行和上一行的年份是同一年,则按上面的规则累计,如果不是同一年还分两种情况,1是上一行的R值小于0则累加,如果大于0,上一行的R值当0来处理 (意思是上一年没请完的年假过期,而请多的要扣回),我在 rules后面用decode不行,求帮忙

建表和记录插入SQL在后面,



create table model_test(
emid varchar2(1),
year1 varchar2(4),
s number(4,1),
a number(4,1),
r number(4,1),
primary key(emid,year1));

insert into model_test values('A','2023',0,1.5,NULL);
insert into model_test values('A','2024',1.5,0,NULL);
insert into model_test values('A','2025',15,0,NULL);
insert into model_test values('A','2026',14,7,NULL);
commit;

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
刘晓华

select * from (select emid,year1,s,a,0 as r,rank() over(partition by emid order by year1) as rn from model_test)
model UNIQUE SINGLE REFERENCE
partition by(emid)
dimension by(RN as m)
measures(year1,s,a,r)
rules automatic order
(r[any]=decode(year1[cv()],
year1[cv()-1],
r[cv()-1],
decode(sign(r[cv()-1]),-1,r[cv()-1],0))+s[cv()]-a[cv()])
order by emid,year1; 

暂无图片 评论
暂无图片 有用 0
暂无图片
yBmZlQzJ

这个不是应该交给开发代码去做吗?干嘛要数据库去操作?

暂无图片 评论
暂无图片 有用 0
刘晓华
题主
2024-05-10
我就是开发...上面的问题我自己搞定了
mocking

你表结构又用工号和年份做主键。。。。。

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏