Freitag, 14. November 2008

Select auf Select (Subquery) ersetzt View

Anforderung:

Ermittlung aller Reports und die Anzahl der Anwender je Report, die seit dem 01.01.2007 von min. 3 verschiedenen Anwendern verwendet wurden.

1.) Mit diesem Select erhalte ich die verschiedenen Anwender mit zugehöriger Report-Nummer:


select distinct rep_anwender, rep_nr
from report_list
where rep_aenddat >= TO_DATE('01.01.2007', 'dd.mm.yyyy')
group by rep_nr, rep_anwender

Anwender Report
1 100
2 100
3 100

Mit diesem Select kann ich eine View erstellen:

CREATE OR REPLACE VIEW V_View_01 AS
select distinct rep_anwender, rep_nr
from report_list
where rep_aenddat >= TO_DATE('01.01.2007', 'dd.mm.yyyy')
group by rep_nr, rep_anwender

2.) Mit dieser View ermittle ich nun zur Report-Nummer die maximale Anzahl der verschiedenen Anwender:


select rep_nr, count (all rep_nr) as maxAnzahl
from V_View_01
group by rep_nr

Als View formuliert:

CREATE OR REPLACE VIEW V_View_02 AS
select rep_nr, count (all rep_nr) as maxAnzahl
from V_View_01
group by rep_nr

3.) Mit dem dritten Select erhalte ich mein gewünschtes Ergebnis:

select rep_nr, maxAnzahl
from V_View02
where maxAnzahl >= 3

Report maxAnzahl
100 3
-------------------------------------------------------------

In Oracle kann ich das nun in folgendem Statement zusammenfassen:


select rep_nr,  
       count (rep_nr) maxAnzahl
  from (  
    select rep_user, 
           rep_nr
      from report_list
     where rep_aenddat >= TO_DATE('01.01.2007', 'dd.mm.yyyy')
    group by rep_nr, 
             rep_anwender
  )
group by rep_nr
having count (rep_nr) >= 3

oder

select rep_nr, maxAnzahl
  from ( 
    select rep_nr, 
           count (all rep_nr) as maxAnzahl
      from ( 
        select distinct rep_anwender, 
               rep_nr
          from report_list
         where rep_aenddat >= TO_DATE('01.01.2007', 'dd.mm.yyyy')
        group by rep_nr, 
                 rep_anwender
      )
    group by rep_nr
  )
where maxAnzahl >= 3

Keine Kommentare: