各位求一条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查询的语句,大家请指教。
表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查询的语句,大家请指教。
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'))
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
ELSE (SELECT MAX(YEAR) FROM TAB) END
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);
order by instr('0',y),y desc
改成
order by (case y when 0 then 9999 else y end) desc
但如果没有2007的数据(比如只有2006、2008的数据),那取2008的数据还是2006的数据?
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>
如果单纯用MAX那到简单了
如果你有条件传入,比如输入2008,倒底应该是查哪个
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>
---- -------------------------------------------------- ----
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>
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