日期:2014-05-16  浏览次数:20941 次

逻辑较复杂的查询问题求高手相助!
表A数据形式:
AAC001(人员编号) ALA040(工伤级别) ALC034(鉴定日期)
00001 4 2010-08-01  
00001 3 2010-10-01  
00002 2 2011-02-01  
00002 4 2011-04-01  
00002 1 2011-06-01  

说明 :工伤级别 1>2>3>4,工伤从鉴定日期的次月开始计算
要求:每个人的发生的工伤按照月份罗列出来,但是有这种情况 
1、一个人4月份先发生4级工伤,到8月份又发生了一次3级工伤,则从9月到10月为4级工伤,11月到今天为3级工伤。
2、如果要是先发生了高级别的工伤则之后发生的低级别工伤则不予考虑,知道发生高级别工伤为止,比如0002人员,在2月份发生了2级工伤,4月份发生了四级工伤,直到6月份又发生了1级工伤,则该人员3月份到6月份都为2级工伤,知道7月份开始才是1级工伤。

查询后期望的结果为:

AAC001(人员编号) ALA040(工伤级别) LAE611(待遇所属期)
00001 4 2010-09  
00001 4 2010-10
00001 3 2010-11  
00001 3 2010-12 
00001 3 2011-01
........ ........ ...........
00001 3 2011-09  
00002 2 2011-02  
00002 2 2011-03
00002 2 2011-04 
00002 2 2011-05
00002 2 2011-06  
00002 1 2011-07
00002 1 2011-08
00002 1 2011-09


本人实在想不出来,该如果写这语句,希望达人指教

------解决方案--------------------
SQL写出来了,没有时间进行优化
SQL code

with T as (
select '00001' AAC001, 4 ALA040, to_date('2010-08-01','YYYY-MM-DD') ALC034 from dual union all
select '00001' AAC001, 3 ALA040, to_date('2010-10-01','YYYY-MM-DD') ALC034 from dual union all
select '00002' AAC001, 2 ALA040, to_date('2011-02-01','YYYY-MM-DD') ALC034 from dual union all
select '00002' AAC001, 4 ALA040, to_date('2011-04-01','YYYY-MM-DD') ALC034 from dual union all
select '00002' AAC001, 1 ALA040, to_date('2011-06-01','YYYY-MM-DD') ALC034 from dual 

)
select *
from  (-- 获取每人员每月份的工伤等级
      select T2.AAC001 ,
             RQB1.RQ ,
             ( select distinct min(ALA040) from T where RQB1.RQ > to_char(ALC034,'YYYY-MM') and AAC001 = T2.AAC001) ALA040
      from  (-- 转为多行,从最小日期到当前月份
            select to_char(add_months(mindate,rownum), 'YYYY-MM') RQ
            from (-- 取最小日期
                  select min(ALC034) mindate from T T1
                  ) 
            connect by  add_months(mindate,rownum) < sysdate
            )  RQB1,
            (select distinct AAC001 from T) T2
      )
where ALA040 is Not Null
order by AAC001,RQ