Nirmal,
You said "I need this in reports". If you mean Oracle Reports, there are a
few ways to do it. If not Oracle Reports, skip down to the <<<SQL>>> part.
1) Create a placeholder column outside query (or use a package variable,
whatever floats your boat).
2) Create a formula column within the group. In it's PL/SQL:
a) Compare the value against the value in the placeholder and setup the
return value.
b) Set the placeholder column equal to the current value.
c) Return the value derived in step a.
Following is example PL/SQL for the formula column where "CP_1" is the
placeholder column and "STEP" is the value we are comparing for gaps:
function CF_1Formula return Char is
v_out varchar2(2);
begin
If :CP_1 is not null Then
If :CP_1 <> :step-1 Then
v_out := '**';
else
v_out := null;
End if;
End if;
:CP_1 := :step;
return(v_out);
end;
There might be a more efficient way to do this in Oracle Reports, but, this
is the first thing that popped to mind.
<<<SQL>>>
A method that avoids a self join.
I try to minimize the number of formula's, frames, etc in Oracle Reports.
So, an alternative method using pure (Oracle's) SQL, if on 8.1.6 or higher,
would be to use LAG analytical function. This will allow you to avoid a self
join. Following is an example with multiple columns so that you can see how
the LAG/LEAD functions work. This SQL could be plugged directly into Oracle
Reports, or, used "as is". Note the nvl stuff I did to handle the first row
since the lag value for the first row would be null (it could have been
handled many other ways):
SQL> l
1 SELECT
2 Decode(step-1,nvl_lag_step,null,'**') Flag,
3 x.step,
4 x.ename,
5 x.lag_step,
6 x.lead_step,
7 x.nvl_lag_step,
8 x.nvl_lead_step
9 FROM (
10 select
11 step,
12 ename,
13 lag(step,1) over (order by step) lag_step,
14 lead(step,1) over (order by step) lead_step,
15 nvl(lag(step,1) over (order by step),step-1) nvl_lag_step,
16 nvl(lead(step,1) over (order by step),step+1) nvl_lead_step
17 from nirmal ) x
18* order by step
SQL> /
FL STEP ENAME LAG_STEP LEAD_STEP NVL_LAG_STEP NVL_LEAD_STEP
-- ---------- ---------- ---------- ---------- ------------ -------------
1 SMITH 2 0 2
2 ALLEN 1 3 1 3
3 WARD 2 5 2 5
** 5 JONES 3 7 3 7
** 7 MARTIN 5 8 5 8
8 BLAKE 7 9 7 9
9 CLARK 8 10 8 10
10 SCOTT 9 15 9 15
** 15 KING 10 16 10 16
16 TURNER 15 21 15 21
** 21 ADAMS 16 23 16 23
** 23 JAMES 21 25 21 25
** 25 FORD 23 28 23 28
** 28 MILLER 25 25 29
Last but not least, if you are *not* talking about Oracle Reports, and, you
are on a version *earlier* than 8.1.6, get back to me. There are other ways
to approach this -- a self join, a function keeping track of a package
variable, etc.
Regards,
Larry G. Elkins
[EMAIL PROTECTED]
-----Original Message-----
Muthu Kumaran
Sent: Tuesday, June 26, 2001 8:01 AM
To: Multiple recipients of list ORACLE-L
Dear Guru's,
How can i refer the previous record detail(s), when oracle fetchs the
current row details?.
sql> SELECT rownum rnum, empno eno, ename FROM EMP;
RNUM ENO ENAME
----------------------------------
1 7369 SMITH
2 7499 ALLEN
3 7521 WARD
4 7566 JONES
7 7782 CLARK
8 7788 SCOTT
10 7844 TURNER
In the above, can i able to put * mark in record 7 and 10, since before
these two records, some records are missing.
Is this possible to do this by query. I need this in reports.
Basically my question is,
How can i refer the previous row detail(s), when oracle fetchs the current
row details?.
Thanks in adv.
REgards,
Nirmal.
--
Please see the official ORACLE-L FAQ: http://www.orafaq.com
--
Author: Larry Elkins
INET: [EMAIL PROTECTED]
Fat City Network Services -- (858) 538-5051 FAX: (858) 538-5051
San Diego, California -- Public Internet access / Mailing Lists
--------------------------------------------------------------------
To REMOVE yourself from this mailing list, send an E-Mail message
to: [EMAIL PROTECTED] (note EXACT spelling of 'ListGuru') and in
the message BODY, include a line containing: UNSUB ORACLE-L
(or the name of mailing list you want to be removed from). You may
also send the HELP command for other information (like subscribing).