Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
![]() |
![]() |
Home -> Community -> Mailing Lists -> Oracle-L -> RE: Rolling sums (?)
Table x_test
year period value 2000 1 1 2000 2 2 2000 3 3 2000 4 4 2000 5 5 2000 6 6 2000 7 7 2000 8 8 2000 9 9
2001 1 13 2001 2 14 2001 3 15
Table Indexed on year column.
select a.year,a.period,sum(b.value)
from x_test a,x_test b
where
(b.year <= a.year) and (b.period between decode((a.year -
b.year),1,a.period,0,1,0) and decode((a.year -
b.year),1,12,0,a.period,0))
group by a.year,a.period
order by a.year,a.period
o/p
year period sum
2000 1 1 2000 2 3 2000 3 6 2000 4 10 2000 5 15 2000 6 21 2000 7 28 2000 8 36 2000 9 45
2001 1 91 2001 2 104 2001 3 117
explain plan
SELECT STATEMENT Optimizer=CHOOSE
SORT (GROUP BY)
NESTED LOOPS
TABLE ACCESS (FULL) OF X_TEST TABLE ACCESS (BY INDEX ROWID) OF X_TEST INDEX (RANGE SCAN) OF XI_TST (NON-UNIQUE)
-----Original Message-----
Sent: Thursday, August 15, 2002 6:43 PM
To: ORACLE-L
Cc: nlzanen1
Maybe having a bad hairday but following code will give me for every
period
number the sum of all work in progress for the period plus the previous
12
periods. Basically it takes the period number from the current record
and
sums a column of that record with the previous 12 periods.
year period value 2000 1 1 2000 2 2 2000 3 3 2000 4 4 2000 5 5 2000 6 6 2000 7 7 2000 8 8 2000 9 9
2001 1 13 2001 2 14 2001 3 15
So for period 2001 1 I need the values 1 thru 13 added together (91) Period 2001 2 needs to be the values 2 thru 14 added together (104) etc....
As you maybe can imagine the explain plan for this baby is 4 full tablescans on quite large tables. (see below)
My question is if somebody has a better solution to handle this query?????
Oracle 8.0.5 !!!
AIX 4.3.3
SELECT V1.ENGAGEMENT
, V1.YEAR
, V1.PERIOD
, MAX(V1.NET_FEE_EARNED_PTD)
, MAX(V1.EXP_WIP_VAL_PTD)
, SUM(V2.TIME_WIP_VAL)
, MAX(V1.GNRL_WON)
, MAX(V1.GNRL_WOFF)
, MAX(V1.TIME_WOFF)
, MAX(V1.WIP_PROV)
, MAX(V1.EXP_WOFF)
, MAX(V1.DB_WOFF)
, MAX(V1.DB_PROV)
select max(WSTAT.ENG_NUMB) AS ENGAGEMENT, max(WSTAT.FNANCL_YEAR) AS YEAR, max(WSTAT.PRD_NUMB) AS PERIOD, SUM(NVL(WSTAT.TIME_WIP_VAL_PTD, 0)) + SUM(NVL(WSTAT.GNRL_W_ON_PTD, 0)) - SUM(NVL(WSTAT.GNRL_W_OFF_PTD, 0)) - SUM(NVL(WSTAT.TIME_WIP_VAL_W_OFF_PTD, 0)) - SUM(NVL(WSTAT.WIP_PRVSN_PTD, 0)) - SUM(NVL(WSTAT.EXP_WIP_VAL_W_OFF_PTD, 0)) - SUM(NVL(DSTAT.DBTRS_W_OFF_PTD, 0)) - SUM(NVL(DSTAT.DBTRS_PRVSN_PTD, 0)) NET_FEE_EARNED_PTD, SUM(NVL(WSTAT.EXP_WIP_VAL_PTD,0)) EXP_WIP_VAL_PTD, SUM(NVL(WSTAT.TIME_WIP_VAL_PTD, 0)) TIME_WIP_VAL, SUM(NVL(WSTAT.GNRL_W_ON_PTD, 0)) GNRL_WON, SUM(NVL(WSTAT.GNRL_W_OFF_PTD, 0)) GNRL_WOFF, SUM(NVL(WSTAT.TIME_WIP_VAL_W_OFF_PTD, 0)) TIME_WOFF, SUM(NVL(WSTAT.WIP_PRVSN_PTD, 0)) WIP_PROV, SUM(NVL(WSTAT.EXP_WIP_VAL_W_OFF_PTD, 0)) EXP_WOFF, SUM(NVL(DSTAT.DBTRS_W_OFF_PTD, 0)) DB_WOFF, SUM(NVL(DSTAT.DBTRS_PRVSN_PTD, 0)) DB_PROV FROM ENG_WIP_STATS WSTAT, ENG_DBTRS_STATS DSTAT WHERE WSTAT.ENG_NUMB(+)=DSTAT.ENG_NUMB AND WSTAT.FNANCL_YEAR=DSTAT.FNANCL_YEAR AND WSTAT.PRD_NUMB=DSTAT.PRD_NUMB GROUP BY WSTAT.ENG_NUMB, WSTAT.FNANCL_YEAR, WSTAT.PRD_NUMB
select max(WSTAT.ENG_NUMB) AS ENGAGEMENT, max(WSTAT.FNANCL_YEAR) AS YEAR, max(WSTAT.PRD_NUMB) AS PERIOD, SUM(NVL(WSTAT.TIME_WIP_VAL_PTD, 0)) + SUM(NVL(WSTAT.GNRL_W_ON_PTD, 0)) - SUM(NVL(WSTAT.GNRL_W_OFF_PTD, 0)) - SUM(NVL(WSTAT.TIME_WIP_VAL_W_OFF_PTD, 0)) - SUM(NVL(WSTAT.WIP_PRVSN_PTD, 0)) - SUM(NVL(WSTAT.EXP_WIP_VAL_W_OFF_PTD, 0)) - SUM(NVL(DSTAT.DBTRS_W_OFF_PTD, 0)) - SUM(NVL(DSTAT.DBTRS_PRVSN_PTD, 0)) NET_FEE_EARNED_PTD, SUM(NVL(WSTAT.EXP_WIP_VAL_PTD,0)) EXP_WIP_VAL_PTD, SUM(NVL(WSTAT.TIME_WIP_VAL_PTD, 0)) TIME_WIP_VAL, SUM(NVL(WSTAT.GNRL_W_ON_PTD, 0)) GNRL_WON, SUM(NVL(WSTAT.GNRL_W_OFF_PTD, 0)) GNRL_WOFF, SUM(NVL(WSTAT.TIME_WIP_VAL_W_OFF_PTD, 0)) TIME_WOFF, SUM(NVL(WSTAT.WIP_PRVSN_PTD, 0)) WIP_PROV, SUM(NVL(WSTAT.EXP_WIP_VAL_W_OFF_PTD, 0)) EXP_WOFF, SUM(NVL(DSTAT.DBTRS_W_OFF_PTD, 0)) DB_WOFF, SUM(NVL(DSTAT.DBTRS_PRVSN_PTD, 0)) DB_PROV FROM ENG_WIP_STATS WSTAT, ENG_DBTRS_STATS DSTAT WHERE WSTAT.ENG_NUMB(+)=DSTAT.ENG_NUMB AND WSTAT.FNANCL_YEAR=DSTAT.FNANCL_YEAR AND WSTAT.PRD_NUMB=DSTAT.PRD_NUMB GROUP BY WSTAT.ENG_NUMB, WSTAT.FNANCL_YEAR, WSTAT.PRD_NUMB
ID PID QUERY_PLAN
----- ----- ------------------------------------------------------------------------ ------------ 0 SELECT STATEMENT Cost = 12531921 1 0 SORT GROUP BY Card=62754915 2 1 MERGE JOIN OUTER Card=62754915 3 2 SORT JOIN Card=1584360 4 3 VIEW Card=1584360 5 4 SORT GROUP BY Card=1584360 6 5 FILTER Card= 7 6 MERGE JOIN OUTER Card= 8 7 SORT JOIN Card=1354977 9 8 TABLE ACCESS FULL ENG_DBTRS_STATS Card=1354977 10 7 SORT JOIN Card=1956365 11 10 TABLE ACCESS FULL ENG_WIP_STATS Card=1956365 12 2 FILTER Card= 13 12 SORT JOIN Card= 14 13 VIEW Card=1584360 15 14 SORT GROUP BY Card=1584360 16 15 FILTER Card= 17 16 MERGE JOIN OUTER Card= 18 17 SORT JOIN Card=1354977 19 18 TABLE ACCESS FULL ENG_DBTRS_STATS Card=1354977 20 17 SORT JOIN Card=1956365 21 20 TABLE ACCESS FULL ENG_WIP_STATSCard=1956365
THX
Indien bovenstaand e-mailbericht niet aan u is gericht, verzoeken wij u
vriendelijk doch dringend het e-mailbericht te retourneren aan de
verzender
en het origineel en eventuele kopieën te verwijderen en te vernietigen.
Ernst & Young hanteert bij de uitoefening van haar werkzaamheden
algemene
voorwaarden, waarin een beperking van aansprakelijkheid is opgenomen. De
algemene voorwaarden worden u op verzoek kosteloos toegezonden.
If you are not the intended recipient of this communication please
return
the communication to the sender and delete and destroy all copies.
In carrying out its engagements, Ernst & Young applies general terms and conditions, which contain a clause that limits its liability. A copy of these terms and conditions is available on request free of charge.
-- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: Jack van Zanen INET: nlzanen1_at_EY.NL 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: ListGuru_at_fatcity.com (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). -- Please see the official ORACLE-L FAQ: http://www.orafaq.com -- Author: INET: cosltemp-g.manoj_at_orbitech.co.in 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: ListGuru_at_fatcity.com (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).Received on Fri Aug 16 2002 - 04:53:39 CDT
![]() |
![]() |