多栏位更新判断问题,100分求解!

langcai1981 2009-04-17 04:27:16
表一:HR_WOLF(IC_CARD,MAC_ID,TIMES)
表二:HR_TEST(IC_CARD,WORK_DATE,S1,S2,S3,S4,S5,S6)
想要达到的效果为,从HR_WOLF中取得某一个员工在某一天内打卡的资料插入到HR_TEST中,该员工当天打卡的第一笔资料放入S1中,第二笔放入S2中,依此类推第六笔放入S6中.
两表关联关系为:HR_WOLF.IC_CARD=HR_TEST.IC_CARD AND TO_CHAR(HR_WOLF.TIMES,'YYYY-MM-DD')=TO_CHAR(HR_WTEST.WORK_DATE,'YYYY-MM-DD')
表一的测试资料如下,希望大家能够给出具体的实现方法,一经测试立即结贴:
IC_CARD MAC_ID TIMES
10025 25 2009-3-20 18:55
10025 22 2009-3-21 7:32
10025 7 2009-3-21 12:45
10025 12 2009-3-21 17:21
10025 14 2009-3-23 7:32
10025 22 2009-3-27 20:07
10025 22 2009-3-28 7:32
10025 18 2009-3-30 7:33
10041 23 2009-3-20 17:07
10041 23 2009-3-23 7:40
10041 12 2009-3-27 12:38
10041 22 2009-3-27 17:00
10041 7 2009-3-28 7:47
10041 22 2009-3-28 12:30
10041 12 2009-3-28 17:10
10041 23 2009-3-30 7:32
...全文
130 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
scottchina 2009-04-18
  • 打赏
  • 举报
回复
CREATE OR REPLACE TRIGGER "INSERT_WOLF" AFTER INSERT ON "SCOTT"."HR_WOLF" FOR EACH ROW
declare
s2 date;
s3 date;
s4 date;
s5 date;
s6 date;
begin
select S2,S3,S4,S5,S6 into S2,S3,S4,S5,S6 from HR_TEST where IC_CARD=:new.IC_CARD AND TO_CHAR(WORK_DATE,'YYYY-MM-DD')=TO_CHAR(:new.TIMES,'YYYY-MM-DD');
if s2 is null then
update HR_TEST set s2=:new.times where IC_CARD=:new.IC_CARD AND TO_CHAR(WORK_DATE,'YYYY-MM-DD')=TO_CHAR(:new.TIMES,'YYYY-MM-DD');
elsif s3 is null then
update HR_TEST set s3=:new.times where IC_CARD=:new.IC_CARD AND TO_CHAR(WORK_DATE,'YYYY-MM-DD')=TO_CHAR(:new.TIMES,'YYYY-MM-DD');

elsif s4 is null then
update HR_TEST set s4=:new.times where IC_CARD=:new.IC_CARD AND TO_CHAR(WORK_DATE,'YYYY-MM-DD')=TO_CHAR(:new.TIMES,'YYYY-MM-DD');

elsif s5 is null then
update HR_TEST set s5=:new.times where IC_CARD=:new.IC_CARD AND TO_CHAR(WORK_DATE,'YYYY-MM-DD')=TO_CHAR(:new.TIMES,'YYYY-MM-DD');
elsif s6 is null then
update HR_TEST set s6=:new.times where IC_CARD=:new.IC_CARD AND TO_CHAR(WORK_DATE,'YYYY-MM-DD')=TO_CHAR(:new.TIMES,'YYYY-MM-DD');
end if;

Exception
when no_data_found then
insert into HR_TEST(IC_CARD,WORK_DATE,S1) values(:new.IC_CARD,:new.TIMES,:new.TIMES);
end;
superhsj 2009-04-18
  • 打赏
  • 举报
回复
呵呵这种情况我也遇到过,我也曾做过考勤的程序,我的处理方法是这样的:把当天的考勤和历史分开存储。
因为一旦一天过去后,基本上每个人的考勤情况就固定了,不会有变化了,只有当天的考勤情况是实时变化的,因此,每天24点过后你可以做一个自动统计的程序把
昨天的考勤就统计出来,这个表很大,统计会慢,但是没有关系,因为这个时候的统计不会有人等着看。这样的话当前记录的表中数据由于少了很多,统计速度相应的大幅度提高了,你可以给用户做一个当天实时统计的程序,、让他们随时统计当前的出勤情况,这个速度是很快的,对于历史的情况由于你在夜间就统计完成了,可以给用户一个查询的程序就可以了,他们也没必要去统计那些历史记录,因为怎么统计数据都不会有变化。
这是我的思路,不知道给你的情况是否一致
[Quote=引用 7 楼 langcai1981 的回复:]
一个月的资料如果同时处理的话,估计用户在速度上是不会接受的.能不能给出相关的函数和存储过程进行处理呀?
[/Quote]
langcai1981 2009-04-17
  • 打赏
  • 举报
回复
一个月的资料如果同时处理的话,估计用户在速度上是不会接受的.能不能给出相关的函数和存储过程进行处理呀?

[Quote=引用 5 楼 superhsj 的回复:]
用3楼的方法就可以,一列一列更新,只是最后一列改为倒序取rn=1
如果你表中的数据量不是巨大的话,这个方法应该能满足你的需求
[/Quote]
langcai1981 2009-04-17
  • 打赏
  • 举报
回复
IC_CARD MAC_ID TIMES
10025 25 2009-3-20 18:55
10025 22 2009-3-21 7:32
10025 7 2009-3-21 12:45
10025 12 2009-3-21 17:21
10025 14 2009-3-23 7:32
10025 22 2009-3-27 20:07
上面的数据需要得到的结果为(数据太长,截去日期):
IC_CARD WORK_DATE S1 S2 S3 S4 S5 S6
10025 2009-3-20 18:55
10025 2009-3-21 7:32 12:45 17:21
10025 2009-3-23 7:32
10025 2009-3-27 20:07
如果出现2楼兄弟所说的问题的话,即当天打卡记录超过6笔时,就会用最后一笔取代S6,简单列一下
如果员工10025在2009-3-21 打了后面的8笔资料7:32 12:45 17:21 17:43 19:56 20:45 21:09 22:10
经过处理后,得到的结果应为:
IC_CARD WORK_DATE S1 S2 S3 S4 S5 S6
10025 2009-3-21 7:32 12:45 17:21 17:43 19:56 22:10
希望大家再测试看看,谢谢!


superhsj 2009-04-17
  • 打赏
  • 举报
回复
用3楼的方法就可以,一列一列更新,只是最后一列改为倒序取rn=1
如果你表中的数据量不是巨大的话,这个方法应该能满足你的需求
langcai1981 2009-04-17
  • 打赏
  • 举报
回复
如果超过6次打卡,最后一笔需更新为最后一笔打卡资料
bw555 2009-04-17
  • 打赏
  • 举报
回复
update  HR_TEST set s1=
(select times from
(select TIMES
, ROW_NUMBER() OVER (PARTITION BY IC_CARD,WORK_DATE ORDER BY TIMES) AS rn
FROM HR_WOLF
where HR_WOLF.IC_CARD=HR_TEST.IC_CARD AND TO_CHAR(HR_WOLF.TIMES,'YYYY-MM-DD')=TO_CHAR(HR_WTEST.WORK_DATE,'YYYY-MM-DD') )
WHERE rn=1)

后面的类似,试一下吧
superhsj 2009-04-17
  • 打赏
  • 举报
回复
如果一天一个员工打开数超过6次怎么处理?取前6次吗?
kk19840210 2009-04-17
  • 打赏
  • 举报
回复
先根据 日期用 ROWNUMBER 排序
然后 根据这个帖子 得到相应的结果 插入数据 http://topic.csdn.net/u/20090327/20/d680cbcb-5539-4c02-917f-e95467c5896b.html

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧