Oefeningen 5 – tennis !



Dovnload 28.32 Kb.
Datum20.08.2016
Grootte28.32 Kb.


OEFENINGEN 5 – tennis !



    1. In oefening b van de vorige oefeningenreeks ben je op zoek gegaan naar alle spelers (woonplaats, naam, geslacht, in volgorde van hun geslacht en naam) voor wie minstens één boete betaald werd maar die geen aanvoerder zijn van een team.
      Je hebt die oefening toen opgelost m.b.v. een subquery ! Probeer nu een andere oplossing uit te werken die gebruik maakt van de combinatie van queries !

Oplossing :


GESLACHT NAAM PLAATS

M Bakker, de Rijswijk

V Moerman Zoetermeer

V Niewenburg Rijswijk
Select geslacht, naam, plaats

From spelers as S, Boetes as B

Where (S.spelersnr = B.spelersnr)

EXCEPT


Select geslacht, naam, plaats
from spelers, teams

Where spelers.spelersnr = teams.spelersnr





    1. Maak een overzicht waarbij je per geslacht aangeeft hoeveel mannelijke en hoeveel vrouwelijke spelers er zijn die in Den Haag of Zoetermeer wonen.

Oplossing :


GESLACHT AANTAL
M 7

V 2
Select geslacht, count(*) as aantal
from spelers
where plaats = ‘Den Haag’
or plaats = ‘Zoetermeer’
group by geslacht
order by geslacht



    1. Geef chronologisch de spelersnummers van de bestuursleden die voorzitter zijn of geweest zijn (chronologisch op begindatum van het voorzitterschap) met vermelding van deze begindatum, alsook hun naam en huidig adres.
      Als het adres niet gekend is (m.a.w. gemeente is onbekend) dan moet “adres ongekend” weergegeven worden. Probeer ook deze oefening op te lossen met een combinatie van queries !

Oplossing :


BEGIN NAAM ADRES
1990-01-01 Elfring Steden 43 3575NH Den Haag

1993-01-01 Permentier Hazensteinln 80 1234KK Den Haag
Select begin_datum as begin, S.naam, S.straat || ' ' || S.huisnr || ' ' || S.postcode || ' ' || S.plaats as adres

From spelers as S, Bestuursleden as B

Where (S.spelersnr = B.spelersnr)

and (b.functie = 'Voorzitter')

and (not S.plaats is null)

UNION


Select begin_datum, S.naam, 'adres ongekend'

From spelers as S, Bestuursleden as B

Where (S.spelersnr = B.spelersnr)

and (b.functie = 'Voorzitter')

and (S.plaats is null)

Order by 1;





    1. Ook deze oefening komt je waarschijnlijk bekend voor : geef een lijst van al de spelers die in Zoetermeer of Amsterdam wonen (nummer, naam, woonplaats en geslacht waarbij je als geslacht “man” of “vrouw” of “verkeerd geslacht” geeft).
      Als je deze opgave nu moet oplossen zonder de case instructie, hoe slaag je er dan in ?

Oplossing :


SPELERSNR NAAM PLAATS GESLACHT
27 Cools Zoetermeer Vrouw

104 Moerman Zoetermeer Vrouw

Select spelersnr, naam, plaats, ‘Vrouw’ as geslacht

From spelers
where plaats in ( ‘Zoetermeer’ , ‘Amsterdam’)
and geslacht = ‘V’

UNION


Select spelersnr, naam, plaats, ‘Man’

From spelers


where plaats in (‘Zoetermeer’, ‘Amsterdam’)
and geslacht = ‘M’



    1. Maak een lijst met alle vrouwelijke spelers uit Den Haag, Zoetermeer, Rotterdam of Leiden die minder dan 3 wedstrijden gespeeld hebben ! Sorteer de lijst alfabetisch op naam !

Oplossing :


NAAM AANTAL_WEDSTRIJDEN

Baalen, van 2

Cools 0

Cools 1

Moerman 1

select naam, count(wedstrijdnr) as aantal_wedstrijden

from spelers left outer join wedstrijden using(spelersnr)

where plaats in ('Den Haag', 'Zoetermeer', 'Rotterdam', 'Leiden')

and geslacht = 'V'

group by spelersnr, naam

having count(wedstrijdnr) < 3

order by naam


Probleem : nu wil men de bovenstaande query aanpassen zodanig dat alle vrouwelijke spelers uit Den Haag, Zoetermeer, Rotterdam of Leiden krijgen die minder dan 3 wedstrijden gespeeld hebben voor team met nummer 2 ! Dit betekent natuurlijk dat mensen die geen wedstrijd gespeeld hebben, ook op de lijst moeten verschijnen !
Aanvankelijk denk je “dit flik ik in 2 microseconden” maar dat blijkt toch niet zo eenvoudig … bedenk eerst waarom … en ga dan op zoek naar de oplossing die je het volgende oplossing geeft
NAAM AANTAL_WEDSTRIJDEN

Baalen, van 2

Cools 1

Cools

Moerman 1
select naam, aantal_wedstrijden

from spelers left outer join (select spelersnr, count(wedstrijdnr) as aantal_wedstrijden

from wedstrijden

where teamnr = 2

group by spelersnr

having count(wedstrijdnr) < 3) as W using(spelersnr)

where plaats in ('Den Haag', 'Zoetermeer', 'Rotterdam', 'Leiden')

and geslacht = 'V'

order by naam

Probleem : en dan heb je de voorgaande oplossing helemaal gevonden en dan bedenkt de gebruiker dat die blanco die daar staat, eigenlijk toch niet mooi ! Deze blanco (null waarde) moet vervangen worden door een 0 !
NAAM AANTAL_WEDSTRIJDEN

Baalen, van 2

Cools 1

Cools 0

Moerman 1

select naam, count(wedstrijdnr) as aantal

from spelers join wedstrijden using(spelersnr)

where teamnr = 2

and plaats in ('Den Haag', 'Zoetermeer', 'Rotterdam', 'Leiden')

and geslacht = 'V'

group by spelersnr, naam

having count(wedstrijdnr) < 3


union
select naam, 0

from spelers

where spelersnr not in (select spelersnr

from wedstrijden

where teamnr = 2)

and plaats in ('Den Haag', 'Zoetermeer', 'Rotterdam', 'Leiden')

and geslacht = 'V'

order by naam





    1. Waarom zal de volgende query fouten geven ? Verbeter zodanig dat de query het juiste resultaat oplevert ! Je kan het natuurlijk gewoon overtikken en PostgreSQL laten aanduiden wat fout is … of je kan zelf nadenken en het zonder hulp proberen op te lossen !

Select spelersnr, naam, totaal bedrag


from spelers as S, boetes as B
group by S.spelersnr

Having bedrag > 25


and totaal bedrag < 200
Select S.spelersnr, naam, sum(bedrag) as totaal_bedrag
from spelers as S, boetes as B
where S.spelersnr =B.spelersnr


And bedrag > 25
group by S.spelersnr, S.naam
having sum(bedrag) < 200



Oefeningen gegevensbanken Hedwich Martens





De database wordt beschermd door het auteursrecht ©opleid.info 2019
stuur bericht

    Hoofdpagina