各位求一条SQL请指教:
表TableA有三个字段:Code(Varchar2(2))、Name(varchar2(50))、Year(Varchar2(4))。
SQL的要求是,检索出表中当前年份的Code和Name,如果没有当前年份的数据,则取出表中最大年份的
Code和Name的数据。
例如:
Code      Name            Year
-------  --------       -------
01       AAA            2008
02       BBB            2008
03       CCC            2008现在是2008年会出去这三条数据,如果是2009年是没有2009年数据也要求显示出2008年的数据,另外只能是
在没有当前年数据时才能查出最大年份的数据,不能只取出最大年份数据,因为可能2008年已经有2009年的数据了。
请问有没有一条SQL查询的语句,大家请指教。

解决方案 »

  1.   

    select code,name from your_table where year=(select max(year) from your_table);
      

  2.   

    那就好的意思就是说不能用“select code,name from your_table where year=(select max(year) from your_table);”,因为已经有2009年的数据了,但是现在是2008年只能是查出2008年的数据。
      

  3.   

    测试过了select code, name, year
      from tableA
     where exists (select 1 from tableA where year = to_char(sysdate, 'yyyy'))
       and year = to_char(sysdate, 'yyyy')
    union
    select code, name,year
      from tableA
     where year = (select max(year) from tableA)
       and not exists
     (select 1 from tableA where year = to_char(sysdate, 'yyyy'))
      

  4.   

    with a as (
        select '001' cd,'2006' year1 from dual
        union
        select '002' cd,'2007' year1 from dual
        union
        select '003' cd,'2009' year1 from dual

    select * from( 
        select cd
        from(
            select extract(year from to_date(year1,'yyyy'))- extract(year from sysdate) y,
                    cd
            from  a
        )b
        order by instr('0',y),y desc 
    )
    where rownum = 1
      

  5.   

    SELECT * FROM  TAB WHERE YEAR=CASE WHEN (SELECT COUNT(*) FROM TAB WHERE YEAR=TO_NUMBER(TO_CHAR(SYSDATE,'yyyy'),9999))>0 THEN TO_NUMBER(TO_CHAR(SYSDATE,'yyyy'),9999)
    ELSE (SELECT MAX(YEAR) FROM TAB) END
      

  6.   

    select *
      from your_table
     where decode(year, to_char(sysdate, 'yyyy'), '9999', year) =
           (select max(decode(year, to_char(sysdate, 'yyyy'), '9999', year))
              from your_table);
      

  7.   

    错了
    order by instr('0',y),y desc 
    改成
     order by (case y when 0 then 9999 else y end) desc
      

  8.   

    如果MAX(YEAR)=2008, 但今年是2007,应该取2007的数据对吧?
    但如果没有2007的数据(比如只有2006、2008的数据),那取2008的数据还是2006的数据?
      

  9.   


    SQL> insert into A values ('01','AAA','2008');
     
    1 row inserted
     
    SQL> insert into A values ('02','BBB','2008');
     
    1 row inserted
     
    SQL> insert into A values ('03','CCC','2008');
     
    1 row inserted
     
    SQL> 
    SQL> select * from a
      2  where a3 = case when (select count(0) from a where a3='2009') >0 then '2009' else '2008' end;
     
    A1                   A2                   A3
    -------------------- -------------------- --------------------
    01                   AAA                  2008
    02                   BBB                  2008
    03                   CCC                  2008
     
    SQL> insert into A values ('04','DDD','2009');
     
    1 row inserted
     
    SQL> 
    SQL> select * from a
      2  where a3 = case when (select count(0) from a where a3='2009') >0 then '2009' else '2008' end;
     
    A1                   A2                   A3
    -------------------- -------------------- --------------------
    04                   DDD                  2009
     
    SQL> 
      

  10.   

    对的
    如果单纯用MAX那到简单了
    如果你有条件传入,比如输入2008,倒底应该是查哪个
      

  11.   

    试下我的select code,name,year from tableA where year=decode((select count(*) from tableA where year=TO_CHAR(sysdate,'YYYY')),0,(select MAX(year) from tableA),TO_CHAR(sysdate,'yyyy'))
      

  12.   

    TRY IT ..
    SQL> SELECT * FROM TT;CODE NAME YEAR
    ---- ---- -----
    01   AAA  2008
    02   BBB  2008
    03   CCC  2008
    04   DDD  2009
    05   EEE  2009
    06   FFF  2010
    07   FFF  20127 rows selectedSQL> -- &THIS_YEA = 2008
    SQL> SELECT *
      2    FROM TT
      3   WHERE YEAR = (SELECT DECODE(SIGN(SUM(DECODE(YEAR,&THIS_YEAR,1,0))),1,&THIS_YEAR,MAX(YEAR)) FROM TT);CODE NAME YEAR
    ---- ---- ----
    01   AAA  2008
    02   BBB  2008
    03   CCC  2008
    -- &THIS_YEA = 2013
    SQL> SELECT *
      2    FROM TT
     17   WHERE YEAR = (SELECT DECODE(SIGN(SUM(DECODE(YEAR,&THIS_YEAR,1,0))),1,&THIS_YEAR,MAX(YEAR)) FROM TT);CODE NAME YEAR
    ---- ---- ----
    07   FFF  2012
    -- &THIS_YEA = 2011
    SQL> SELECT *
      2    FROM TT
     17   WHERE YEAR = (SELECT DECODE(SIGN(SUM(DECODE(YEAR,&THIS_YEAR,1,0))),1,&THIS_YEAR,MAX(YEAR)) FROM TT);CODE NAME YEAR
    ---- ---- ----
    07   FFF  2012SQL> 
      

  13.   

    SQL> SELECT * FROM A;CODE NAME                                               YEAR
    ---- -------------------------------------------------- ----
    01   AAA                                                2008
    02   BBB                                                2008
    03   CCC                                                2008
    04   DDD                                                2009
    03   CCC                                                2009SQL> 
    SQL>  SELECT *
      2     FROM A
      3    WHERE YEAR = (SELECT DECODE(MAX(YEAR),
      4                                TO_CHAR(SYSDATE, 'YYYY'),
      5                                MAX(YEAR),
      6                                TO_CHAR(SYSDATE, 'YYYY'))
      7                    FROM A)
      8  ;CODE NAME                                               YEAR
    ---- -------------------------------------------------- ----
    01   AAA                                                2008
    02   BBB                                                2008
    03   CCC                                                2008SQL> 
      

  14.   

    select T.* from TEST_ZY T
            CODE    NAME    YEAR
    01 AAA 2008
    02 BBB 2008
    03 CCC 2006
    04 DDD 2009
    05 EEE 2009
    06 FFF 2012
    07 GGG 2012-----------------------------------------------------------------------------------------
    SQL->
    select T.* from TEST_ZY T
     WHERE T.YEAR1 = DECODE((SELECT COUNT(*)
                              FROM TEST_ZY T2
                             WHERE T2.YEAR1 =TO_CHAR(SYSDATE, 'YYYY')
                             ),--如果有当年的数据,则count(*)>0
                            0,--count(*)=0,则没有当年的数据
                            (SELECT MAX(T3.YEAR1)
                              FROM TEST_ZY T3
                             ),--取最大年份的值
                            TO_CHAR(SYSDATE, 'YYYY')--取当前年份
                            )
    ---------------------------------------------------------------------------------------
    查询结果
    code    name    year
    01 AAA 2008
    02 BBB 2008