rang im SQL

Bisweilen sehr nützlich ist ein Ranking der Ergebniszeilen:

Bsp:
select quartal, pg_id, vgl_key,
row_number() over (partition by pg_id order by pg_id) pg_rang,
row_number() over (partition by vgl_key order by vgl_key) vg_rang
from (select distinct quartal, pg_id, vgl_key from REP_PG_RTM
where QUARTAL = 20091);


Die innere Abfrage liefert alle Kombinationen von PG und VG. Dabei können natürlich einzelne PG (bzw. VG) mehrfach vorkommen:

102 - 128
102 - 129
104 - 129

Sollen PG- und VG-Summen (Bsp. Fälle) zugeordnet werden, werden diese für jede Zeile zugeordnet:

1.427 Fälle - 102 -- 128 - 1.627 Fälle
1.427 Fälle - 102 -- 129 - 1.514 Fälle
1.312 Fälle - 104 -- 129 - 1.514 Fälle

Für Prüfsummen über die zugeordneten Fälle ist das ungünstig, dann darf die Fallzahl nur EINMAL gelistet werden:

1.427 Fälle - 102 -- 128 - 1.627 Fälle
- 102 -- 129 - 1.514 Fälle
1.312 Fälle - 104 -- 129 -

Hier hilft das Rang: Durch das Ranking wird das Vorkommen der Zeilen gezählt und der Join nur für Rang = 1 durchgeführt:

select RTM.QUARTAL, RTM.PG_ID, RTM.VGL_KEY, sum(PG.ANZ_FAELLE) pg_fa, sum(VG.ANZ_FAELLE) vg_fa, pg_rang, vg_rang
from
(select quartal, pg_id, vgl_key,

row_number() over (partition by pg_id order by pg_id) pg_rang,
row_number() over (partition by vgl_key order by vgl_key) vg_rang
from (select distinct quartal, pg_id, vgl_key from REP_PG_RTM where QUARTAL = 20091)) rtm,
(select pg_id, sum(anz_faelle) anz_faelle, 1 rang from rep_pg where QUARTAL = 20091 group by pg_id) pg,
(select vgl_key, sum(anz_faelle) anz_faelle, 1 rang from rep_vg where QUARTAL = 20091 group by vgl_key) vg
where RTM.PG_ID = PG.PG_ID(+)

and RTM.VGL_KEY = VG.VGL_KEY(+)
and rtm.pg_rang = pg.rang(+)
and rtm.vg_rang = vg.rang(+)
group by RTM.QUARTAL, RTM.PG_ID, RTM.VGL_KEY, pg_rang, vg_rang;


Kommentare

Beliebte Posts aus diesem Blog

PGA unter Oracle 11g

trunc(sysdate) - nette Spiele mit dem Datum

Datapump - Verzeichnis erstellen