现有字段和数据如下:字段: nendo(年度,YYYYMMDD);entry_no(单位编号)
数据:A:20060501             0001
数据:B:20060601             0001
数据:C:20060201             0001
数据:D:20050501             0002
数据:E:20050601             0002
数据:F:20050201             0002检索的条件是,同一单位同一年度只显示一条记录,且年度的计算是有说法的,如果月分小于3月31日的算上一年度,也就是说年度的划分是从上年4月1日到今年的3月31日;上例中记录C(年度:20060201)的年度就应为2005。上面的数据应得到如下的结果:     2006       0001
     2005       0001
     2005       0002
     2004       0002
上面的SQL语句要如何写才能实现,还请各位大侠帮忙。有劳了!
还有就是如果有几十万条记录实现起来会很慢吗?

解决方案 »

  1.   

    select year,
           min(entry_no) entry_no
    from (
          select (case when substr(nendo,5,4)<= '0331' then substr(nendo,1,4) - 1 else substr(nendo,1,4)) year,
                 entry_no
            from table
         )
    group by year
      

  2.   

    改一下 
    (case when substr(nendo,5,4)<= '0331' then substr(nendo,1,4) - 1 else substr(nendo,1,4) end) year
      

  3.   

    SQL> Select Year, entry_no from (select Nendo, Case When Substr(Nendo,-4,4) > '0401'
      2         then to_number(substr(Nendo,1,4)) else to_number(substr(Nendo,1,4))-1
      3         end year, entry_no from test)
      4  Group by  entry_no,Year;      YEAR ENTRY_NO
    ---------- --------
          2005 0001
          2006 0001
          2004 0002
          2005 0002
      

  4.   

    SQL>  select distinct nendo,entry_no 
          from  
          (select decode(substrb(nendo,5,2),01,substrb(nendo,1,4)-1,
                02,substrb(nendo,1,4)-1,
                03,substrb(nendo,1,4)-1,
                04,substrb(nendo,1,4),
                05,substrb(nendo,1,4),
                06,substrb(nendo,1,4),
                07,substrb(nendo,1,4),
                08,substrb(nendo,1,4),
                09,substrb(nendo,1,4),
                10,substrb(nendo,1,4),
                11,substrb(nendo,1,4),
                12,substrb(nendo,1,4)) nendo,
    entry_no from test111);
    ====================================================     NENDO ENTRY
    ---------- -----
          2004 0002
          2005 0001
          2005 0002
          2006 0001
    或许还有其他更好的方法。
    基本信息放在test111表中
      

  5.   

    ^_^ 不知道行不行?请指教!速度自己测试一下吧!
    select distinct entry_no,
    decode(
    (substr(nendo,6,3) - '331'), 1 ,
    substr(nendo, 1, 4) ,
    substr(nendo, 1, 4) + 1)
    from 表名
      

  6.   

    谢谢大家的帮忙!功能可能实现了,只是不知道速度怎么样?几十万条数据这种方法会不会很慢,还用更好的方法吗? 谢谢snooper(snooper) ; 谢谢czbbbs(强弩),我在等一天如果没有更好的方法我会把分送给二位的,谢谢二位!