Lösung Fragezeichenfolien

Werbung
P
7. Einfache Auswertungen aus der Datenbank (select)
[…] 7.3 Projektion
Erzeuge eine Übersicht aller existierender Warengruppen
Select distinct warengruppe
from artikel
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 1
P
7.4 Selektion (where-Klausel)
[…] 7.4.2 Bereichsprüfung mittels between
Nenne Rechnungsnummer, Kundennummer und
Rechnungsbetrag aller Rechnungen, die nicht länger als 3
Monate fällig sind und noch nicht bezahlt wurden !
Select Rechnung_nr, kunde_nr, rechnung_betrag
From rechnungen
Where bezahlt=0 and datum_faellig between current_date and
current_date-90
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 2
P
7.4 Selektion (where-Klausel)
7.4.3 Operation IN / NOT IN
Mächtig, wenn die Prüfung auf Enthalten-Sein nicht auf einer
konstanten sondern einer berechneten Menge basiert:
Welche Kunden (Kundennummer, Name) haben in 2005 noch
keinen Auftrag erteilt ?
Select kunde_nr, name
From kunden
Where kunde_nr not in
(select kunde_nr from auftraege where extract(year from auftragsdatum) = 2005)
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 3
P
7.4 Selektion (where-Klausel)
7.4.3 Operation IN / NOT IN
Erzeuge eine Liste mit Artikelnummer und Bezeichnung aller
Artikel, die im Jahre 2004 verkauft wurden
Select artikel_nr, bezeichnung
From artikel
Where artikel_nr in
(select artikel_nr from auftragspositionen where extract(year from termin)=2004)
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 4
P
7.4 Selektion (where-Klausel)
[…] 7.4.4 Operator Like <Muster>:“Matchen“ von Zeichenketten
Beispiel:
Nenne die Artikelnummer aller Artikel, in deren Bezeichnung die
Kennworte ‘Digital‘ und ‘Kamera‘ vorkommen.
Select artikel_nr
from artikel
where bezeichnung like ‚%Digital%‘ and bezeichnung like ‚%Kamera%‘
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 5
P
7.4 Selektion (where-Klausel)
[…] 7.4.4 Operator Like <Muster>:“Matchen“ von Zeichenketten
Beispiel:
Nenne die Artikelnummer aller Artikel, in deren Bezeichnung die
Kennworte ‘Digital‘ und ‘Kamera‘ in dieser Reihenfolge
vorkommen.
Select artikel_nr
from artikel
where bezeichnung like ‚%Digital%Kamera%‘
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 6
P
[..] 7.5 Sortierung (order by – Klausel)
Geben Sie die Artikel geordnet nach ihrer Bezeichnung aus.
Artikel mit leerer Bezeichnung sollen am Ende stehen.
select *
from artikel
order by case when bezeichnung is null then ‘ZZZZ‘ else
bezeichnung end
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 7
P
7.9 Gruppierungen von Daten
[…] 7.9.1 Gruppenfunktionen
Was ist die maximale Gewinnspanne im Artikelbereich ?
Select max(verkaufspreis - einkaufspreis)
From artikel;
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 8
P
7.9 Gruppierungen von Daten
[…] 7.9.1 Gruppenfunktionen
Was ist die maximale Gewinnspanne im Artikelbereich ? Wenn
sie größer ist als das zweifache des größten Einkaufpreises,
schreiben Sie ‘!!!‘ dahinter.
Select
case when max(verkAUFSPREIS-einkaufspreis) > 2*max(einkaufspreis)
then cast( max(verkAUFSPREIS-einkaufspreis) as char(10) ) || ‚!!‘
else cast( max(verkAUFSPREIS-einkaufspreis) as char(10))
end
From artikel;
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 9
P
7.9 Gruppierungen von Daten
[…] 7.9.2 Gruppieren von Daten (group by)
Ermittle je Kunde (Nummer) die Anzahl seiner Aufträge im Jahr
2005 !
Select kunde_Nr, count(*)
From auftraege
Where extract (year from auftrag_datum) = 2005
Group by 1
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 10
P
7.9 Gruppierungen von Daten
[…] 7.9.2 Gruppieren von Daten (group by)
Ermittle die Summe der Rechnungsbeträge der in den Jahren
2002-2006 gestellten Rechnungen gestaffelt nach Jahr.
Select extract(year from rechnung_datum), sum(rechnung_betrag)
From rechnungen
Where extract(year from rechnung_datum) between 2002 and 2006
Group by extract(year from rechnung_datum)
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 11
P
7.9 Gruppierungen von Daten
[…] 7.9.2 Gruppieren von Daten (group by)
Ermittle den größten erzielten Verkaufspreis je Artikel je
Verkaufsjahr (auftragspositionen, termin)
select artikel_nr, extract( year from termin), max(preis)
From auftragspositionen
group by artikel_nr, extract( year from termin)
order by 1;
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 12
P
7.9 Gruppierungen von Daten
[…] 7.9.3 Einschränkungen der Aggregierung (having)
Listen Sie je Kunde die Kundennummer sowie das Fälligkeitsdatum
(datum_faellig) seiner unbezahlten Rechnung mit der längsten
Überfälligkeit auf (Überfälligkeit = fällig und nicht bezahlt). Führen Sie nur
Kunden auf, bei denen dieses Fälligkeitsdatum um mehr als 2 Wochen
überschritten ist.
select kunde_nr, min(datum_faellig) "Längste Überfälligkeit"
from rechnungen
where bezahlt=0 and datum_faellig <= current_date
group by kunde_nr
having min(datum_faellig) < current_date -14;
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 13
P
7.9 Gruppierungen von Daten
[…] 7.9.3 Einschränkungen der Aggregierung (having)
Listen Sie die Auftragsnummer und den größten Positionstermin je
Auftrag auf. Geben Sie nur dann die Daten aus, wenn der größte
Positionstermin älter als ein Jahr ist.
Select auftrag_nr, max(termin)
From auftragspositionen
Group by auftrag_nr
Having current_date – max(termin) > 365;
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 14
P
[…] 8.3 Unterabfragen (mit Variablen)
Listen Sie alle Aufträge auf (Auftragsnummer, Kunde_nr), bei denen der
größte Liefertermin (Feld termin in den Auftragspositionen) sich vom
Auftragsdatum um mehr als 1 Jahr unterscheidet.
select a.auftrag_nr , kunde_nr
from auftraege a
where abs(auftrag_datum – (select max(termin) from
auftragspositionen b where a.auftrag_nr=b.auftrag_nr) ) > 365
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 15
P
[…] 8.3 Unterabfragen (mit Variablen)
Nenne je Branche den Kunden aus der Branche, der den höchsten
Jahresumsatz hat.
select branche, kunde_nr, jahresumsatz
from kunden k2
where jahresumsatz=
(select max(jahresumsatz) from kunden k1 where k1.branche=k2.branche);
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 16
P
[…] 8.4 Weitere Vergleiche mit Subqueries (all, any, exist)
Listen Sie alle Artikel (artikel_nr) auf, die im Jahr 2005 noch nicht verkauft
wurden (Datum Termin in Tabelle Auftragspositionen).Lösung über exists.
Select artikel_nr
From artikel a
Where not exists
(Select artikel_nr
from auftragspositionen p
Where extract(year from auftrags_datum)= 2005
And a.artikel_nr = p.artikel_nr)
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 17
PJoin
[…] 9.3/4 Join
Listen Sie für alle Artikel die Artikelnummer auf, den Inhalt des Attributs
„bestand_lager“ aus der Tabelle „artikel“ sowie die Summe der
Lagerbestände jedes Artikels auf allen Lagerplätzen. Wenn ein Artikel
keinen Bestand auf Lagerplätzen hat, schreiben Sie stattdessen „kein
Lagerplatzbestand“ in die entsprechende Spalte.
select a.artikel_nr, a.bestand_lager, case when
isnull(sum(ar.bestand_lager),0)=0 then ‚kein lagerplatzbestand’ else cast
(sum(ar.bestand_lager) as char(25) ) end
from artikel a left outer join artikel_lager ar on a.artikel_nr=ar.artikel_nr
group by 1,2
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 18
P
[…] 9.3/4 Join
Artikel können zu einem Preis verkauft werden (Preis in Tabelle
auftragspositionen), der vom Normalpreis abweicht (Verkaufspreis in
Tabelle artikel).
Listen Sie für alle Artikel, die in Auftragspositionen vorkommen, über alle
Positionen hinweg die durchschnittliche Abweichung des Verkaufspreises
vom Normalpreis auf.
Select a.artikel_nr, avg(abs(preis-verkaufspreis))
From auftragspositionen a join artikel b on a.artikel_nr=b.artikel_nr
Group by a.artikel_nr
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 19
P
[…] 9.3/4 Join
Erzeugen Sie eine Liste, die je Warengruppe die Anzahl aktiver
Positionen angibt, in denen Artikel mit dieser Warengruppe vorkommen.
Berücksichtigen Sie nur Warengruppen mit mehr als 10 Positionen.
Ordnen Sie die Ausgabe nach der Positionszahl absteigend.
Select warengruppe, count(*)
From artikel join auftragspositionen on
artikel.artikel_nr=auftragspositionen.artikel_nr
Where auftragspositionen.aktiv = 1
Group by 1
Having count(*) > 10
Order by count(*) desc
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 20
P Outer
[…] 9.5 Der Outer – Join
Ermitteln Sie aus den Daten die Summe der Auftragswerte aller Aufträge
je Kunde, die diese im Jahr 2005 (auftragdatum)erteilt haben
(Auftragswert= Summe verkaufsmenge * verkaufspreis über alle
Positionen des Auftrages). Geben Sie die Kundennummer, den Namen
sowie die Auftragswertsumme aus. Berücksichtigen Sie auch Kunden, die
im Jahr 2005 keine Aufträge erteilt haben.
select k.kunde_nr, k.name, sum(p.preis*p.menge)
from kunden k left outer join
(auftraege a join auftragspositionen p on a.auftrag_nr=p.auftrag_nr)
on k.kunde_nr = a.kunde_nr
and extract(year from a.auftrag_datum) = 2005
group by k.kunde_nr, k.name
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 21
P Outer
[…] 9.5 Der Outer – Join
Ermitteln Sie je Kunde die Anzahl der für den Kunden
geschriebenen Rechnungen, sowie die Summe der in Mahnung
befindlichen Rechnungswerte . Gemahnt wird immer die
Differenz aus Rechnungsbetrag und Zahlbetrag. Eine Rechnung
ist in Mahnung, wenn sie ein Mahndatum hat und nicht bezahlt
ist. Führen auch Kunden auf, zu denen es keine Rechnung gibt.
Select kunde_nr, name, count(r.kunde_nr),
sum(case when datum_mahnung is not null and nvl(bezahlt,0)=0
then rechnungbetrag-zahlbetrag_gesamt else 0 end )
From kunden k left outer join rechnungen r on k.kunde_nr=r.kunde_nr
Group by 1,2
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 22
P View
[…] 11.2 Anwendungsbereiche von Views
Ermitteln Sie je Vertreter die Anzahl der von ihm abgeschlossenen
Aufträge im Jahr 2004 sowie den Wert dieser Aufträge (Produkt
Menge*Preis der betreffenden Auftragspositionen). Tipp: Benutzen Sie
einen Hilfs-View!
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 23
P View
[…] 11.2 Anwendungsbereiche von Views
create view awert ( vert_nr, wert) as
select vertreter_nr, sum(menge*preis) from auftraege join
auftragspositionen on auftraege.auftrag_nr =
auftragspositionen.auftrag_nr where year(auftrag_datum)=2004
group by 1
select vertreter_nr, wert, count(*)
from auftraege join awert on vertreter_nr=vert_nr) where
year(auftrag_datum)=2004
group by 1,2
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 24
P View
[…] 11.2 Anwendungsbereiche von Views
Ermitteln Sie je in den Kunden vorkommenden Vertreter die Anzahl der
von ihm abgeschlossenen Aufträge im Jahr 2005 (auftrag_datum), die
Summe der Rechnungsbeträge aller Rechnungen, die aus Aufträgen des
Vertreters hervorgegangen sind (nur Rechnungen des Jahres 2005
berücksichtigen) sowie die Summe der offenen Beträge
(rechnungsbetrag-zahlbetrag_gesamt) aus den unbezahlten Rechnungen
(auch nur 2005), die dem Vertreter zuzuordnen sind. Führen Sie auch
Vertreter auf, zu denen es keine Aufträge bzw. Rechnungen in 2005 gibt
(zu jeder Rechnung muss es einen Auftrag geben !). (Hinweis: Die
Aufgabe ist nur mit views lösbar, beginnen Sie mit einem view, der alle
Vertreter ermittelt)
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 25
P View
[…] 11.2 Anwendungsbereiche von Views
Create view summrech (vertreter_nr, summrech) as
Select k.vertreter_nr, sum(r.rechnung_betrag)
From kunden k join rechnungen r on k.kunde_nr=r.kunde_nr
year(rechnung_datum)=2005
Where
Group by 1
Create view summoffrech (vertreter_nr, summoffrech) as
Select k.vertreter_nr, sum(r.rechnungsbetrag-r.zahlbetrag_gesamt)
From kunden k join rechnungen r on k.kunde_nr=r.kunde_nr
Where year(rechnung_datum)=2005 and bezahlt=0
Group by 1
Select a.vertreter_nr, anzahl, summrech, summoffrech
From alle_vertreter a. left outer join
((anzauft t1 left outer join summrech t2 on t1.vertreter_nr=t2.vertreter_nr)
join summoffrech t3 on t2.vertreter_nr=t3.vertreter_nr)
on a.vertreter_nr = t1.vertreter_nr
Datenbanken 1
- WS 2007/2008 - © Prof. Dr. Klaus-Dieter Krägeloh - Folie 26
Herunterladen