Microsoft
Software
Hardware
Network
Question : Oracle 9i SQL decode
Hi,
I am trying write a SQL based on the following condition:
select
a.id,
a.col2 f_name,
b.col3 L-name,
c.v_date date_1,
decode(a.cat,'007','first'
,'008','se
cond','') as cat_type
.....
from a,b,c,...
where
......
The change I want to do on the above SQL is:
If the above SQL returns just one record for "first" and one for "second", I want to display only the record containing "first", this I can get by using MIN function in the decode, that is:
min(decode(a.cat,'007','fi
rst','008'
,'second',
'')) as cat_type, I will get just the record containing "first".
But, If it returns, more than one record for the "first" or "second" then it should return as it is.
For eg:
ID F_Name L_Name cat_type date_1
1 john smith first 02/01/2010
1 john smith first 14/04/2010
1 john smith second 05/03/2010
2 ..........................
.....
..........................
.....
..........................
.....
or
ID F_Name L_Name cat_type date_1
1 john smith first 02/14/2010
1 john smith second 04/16/2010
1 john smith second 02/19/2010
..........................
.....
..........................
.....
or
ID F_Name L_Name cat_type date_1
1 john smith first 02/17/2010
1 john smith first 01/19/2010
1 john smith second 03/20/2010
1 john smith second 02/28/2010
..........................
..........
..........
..........
......
..........................
.....
so on so forth..
I want to do something like:
(CASE WHEN ((a.cat = '007' AND COUNT(a.cat) > 1)
OR (a.cat = '008' AND COUNT(a.cat) > 1) ) THEN
decode(a.cat,'007','first'
,'008','se
cond','')
ELSE min(decode(a.cat,'007','fi
rst','008'
,'second',
'') )
END
) as cat_type
But this is not working properly..
Can somebody suggest a method to solve this?
Thanks@
Related Solutions:
Oracle SQL -- WHERE NOT CLAUSE
Answer : Oracle 9i SQL decode
to make it even more simple, all you need is the below i think. It produces same results as shown in the screenshat which i already attached.. we do not need addition group by etc..
Try this and choose which ever you want.
select *
from (
SELECT X.*,
COUNT(DECODE(X.C_TYPE, 'PRIMARY', 1, null)) OVER (PARTITION BY X.ID) PRIM_CNT,
COUNT(DECODE(X.C_TYPE, 'INITIAL', 1, null)) OVER (PARTITION BY X.ID) INIT_CNT
FROM
(SELECT T1.ID, T1.NAME, T1.DESCRP, t2.c_desc,
decode(T2.C_ID,'007','PRIM
ARY','008'
,'INITIAL'
,'') as C_TYPE
FROM TEST T1, TEST2 T2
WHERE
T1.ID = T2.ID
) X
group by x.ID, x.NAME, x.DESCRP, x.c_desc, x.C_TYPE ) A
where not ( a.prim_cnt =1 and a.init_cnt = 1 and c_type='PRIMARY' )
Thanks
Random Solutions
Sync a users AD password with a SQL table?
jquery validator and asp.net updatepanel
Predicted harddrive failure
How to Create Firebird Trigger to get AutoID by using Vb.net code
Is it possible to encrypt an email message using PHP?
ClearOS Enterprise 5.2 Alpha 1
How do you use an underscore character in an AutoCad LISP script?
Windows 2003 WMI Errors after VMWare Virtualization
Dell PowerEdge Perc 4e/Di RAID 1 expansion
Oracle Join null rows.