Advertisement
Guest User

oplossingen

a guest
Nov 13th, 2019
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. OPGAVE
  2. Geef voor alle huidige bestuurleden hun functie en de lijst van boetes die voor hen werd betaald. Omdat je dit wil vergelijken met de boetebedragen die betaald werden voor leden die niet in het bestuur zitten, wil je deze boetebedragen ook opnemen in de tweede kolom van je resultaat. Sorteer je antwoord eerst op functie en daarna op het boetebedrag.
  3.  
  4. OPLOSSING
  5. SELECT bs.functie, b.bedrag
  6. FROM boetes AS b
  7. FULL OUTER JOIN bestuursleden AS bs ON bs.spelersnr = b.spelersnr
  8. WHERE bs.eind_datum IS NULL
  9. ORDER BY functie, bedrag
  10. OPGAVE
  11. Geef voor elke mannelijke speler wiens naam minstens 2 keer de letter 'e' bevat zijn functie die hij op dit moment uitoefent, als die er op dit moment één heeft. Sorteer op naam en functie.
  12.  
  13. OPLOSSING
  14. SELECT s.naam, s.geslacht, bs.functie
  15. FROM spelers AS s
  16. LEFT OUTER JOIN bestuursleden AS bs ON bs.spelersnr = s.spelersnr AND bs.eind_datum IS NULL
  17. WHERE s.naam ilike '%e%e%' AND s.geslacht = 'M'
  18. OPGAVE
  19. Geef alle spelers die geen boete gekregen hebben en niet in Den Haag wonen. Sorteer op jaar van toetreden.
  20.  
  21. OPLOSSING
  22. SELECT s.spelersnr, s.naam, s.plaats
  23. FROM spelers AS s
  24. LEFT OUTER JOIN boetes AS b USING (spelersnr)
  25. WHERE b.spelersnr IS NULL AND s.plaats != 'Den Haag'
  26. ORDER BY s.jaartoe
  27. OPGAVE
  28. Geef een aflopend gesorteerde lijst van de nummers van alle spelers waarvoor nog geen boete werd betaald en die nog nooit in het bestuur van de tennisvereniging hebben gezeten.
  29.  
  30. OPLOSSING
  31. SELECT s.spelersnr
  32. FROM spelers AS s
  33. LEFT OUTER JOIN boetes AS b ON s.spelersnr = b.spelersnr
  34. LEFT OUTER JOIN bestuursleden AS bs ON s.spelersnr = bs.spelersnr
  35. WHERE b.spelersnr IS NULL AND bs.spelersnr IS NULL
  36. ORDER BY s.spelersnr DESC
  37. OPGAVE
  38. Geef van elke speler (die wedstrijden gespeeld heeft en boetes gekregen heeft) wonend in Rijswijk het spelersnr, de naam, de lijst met boetebedragen en de lijst met teams waarvoor hij/zij een wedstrijd gespeeld heeft. Geef het resultaat volgens oplopend spelersnr en boetebedrag.
  39.  
  40. OPLOSSING
  41. SELECT s.spelersnr, s.naam, b.bedrag, w.teamnr
  42. FROM spelers AS s
  43. INNER JOIN boetes AS b
  44. on b.spelersnr = s.spelersnr
  45. INNER JOIN wedstrijden AS w
  46. on w.spelersnr = s.spelersnr
  47. WHERE s.plaats = 'Rijswijk'
  48. ORDER BY spelersnr
  49. OPGAVE
  50. Geef het spelersnummer en bondsnummer van alle spelers die jonger zijn dan de speler met bondsnummer 8467. gebruik een INNER JOIN.
  51.  
  52. OPLOSSING
  53. SELECT s.spelersnr, s.bondsnr
  54. FROM spelers AS s1
  55. INNER JOIN spelers AS s ON s.geb_datum > s1.geb_datum
  56. WHERE s1.bondsnr = '8467'
  57. OPGAVE
  58. Geef voor alle vrouwelijke spelers die in Den Haag, Zoetermeer of Leiden wonen het spelersnummer, hun woonplaats en een lijst van de teams waarvoor ze ooit gespeeld hebben, als ze ooit een wedstrijd gespeeld hebben.
  59.  
  60. OPLOSSING
  61. SELECT s.spelersnr, s.plaats, w.teamnr
  62. FROM spelers AS s
  63. LEFT OUTER JOIN wedstrijden AS w USING (spelersnr)
  64. WHERE s.geslacht = 'V' AND s.plaats IN ('Den Haag', 'Zoetermeer', 'Leiden')
  65. OPGAVE
  66. Geef voor de actieve bestuursleden zonder boete hun laatste gespeelde wedstrijd (die met het hoogste wedstrijdnummer). Sorteer aflopend op spelersnr.
  67.  
  68. OPLOSSING
  69. SELECT bs.spelersnr, MAX(w.wedstrijdnr) AS laatstewedstrijd
  70. FROM bestuursleden AS bs
  71. INNER JOIN wedstrijden AS w ON bs.spelersnr = w.spelersnr
  72. LEFT OUTER JOIN boetes AS b ON b.spelersnr = bs.spelersnr
  73. WHERE bs.eind_datum IS NULL AND b.spelersnr IS NULL
  74. GROUP BY bs.spelersnr
  75. ORDER BY bs.spelersnr DESC
  76.  
  77. SELECT bs.spelersnr, MAX((SELECT wedstrijden.wedstrijdnr FROM wedstrijden WHERE wedstrijden.spelersnr = wbs.spelersnr)) AS laatstewedstrijd
  78. FROM bestuursleden AS bs
  79. LEFT OUTER JOIN boetes AS b ON b.spelersnr = bs.spelersnr
  80. WHERE bs.eind_datum IS NULL AND b.spelersnr IS NULL
  81. ORDER BY bs.spelersnr DESC```
  82.  
  83.  
  84. ## OPGAVE ##
  85.  
  86. Geef per team de leeftijd van de aanvoerder (tip: postgresql heeft een AGE() functie) en het aantal verschillende spelers dat voor dit team gespeeld heeft.
  87. Alleen teams waarvoor wedstrijden zijn gespeeld en die een aanvoerder hebben, moeten vermeld worden.
  88. Sorteer op leeftijd en daarna op aantal verschillende spelers en daarna op teamnr.
  89.  
  90. ### OPLOSSING ###
  91.  
  92. ```sql
  93. SELECT t.teamnr, extract (year FROM age(s.geb_datum))||' jaar' AS leeftijd, COUNT(distinct w.spelersnr) AS aantalspelers
  94. FROM teams AS t
  95. INNER JOIN spelers AS s ON s.spelersnr = t.spelersnr
  96. INNER JOIN wedstrijden AS w ON w.teamnr = t.teamnr
  97. GROUP BY t.teamnr, s.geb_datum
  98. ORDER BY s.geb_datum DESC, aantalspelers, t.teamnr
  99. OPGAVE
  100. Geef per team het hoogste wedstrijdnummer van een wedstrijd, gespeeld door een bestuurslid (actief en niet meer actief) die geen boete heeft gekregen. Sorteer op teamnr.
  101.  
  102. OPLOSSING
  103. SELECT t.teamnr, MAX(w1.wedstrijdnr) AS laatstewedstrijd
  104. FROM bestuursleden AS bs --alle bestuursleden, actief en niet actief
  105. INNER JOIN wedstrijden AS w1 ON w1.spelersnr = bs.spelersnr --wedstrijden gespeeld door bestuursleden
  106. LEFT OUTER JOIN boetes AS b ON b.spelersnr = bs.spelersnr
  107. WHERE b.spelersnr IS NULL
  108. GROUP BY t.teamnr
  109. ORDER BY t.teamnr
  110. OPGAVE
  111. Welke reizigers hebben al meer dan 1 reis ondernomen waarvoor ze meer dan 2,5 miljoen euro moesten betalen? Sorteer op naam
  112.  
  113. OPLOSSING
  114. SELECT k.naam, COUNT(d.reisnr) AS aantal_reizen
  115. FROM klanten AS k
  116. INNER JOIN deelnames AS d USING (klantnr)
  117. INNER JOIN reizen AS r USING (reisnr)
  118. WHERE prijs > 2.5
  119. GROUP BY k.klantnr, k.naam
  120. HAVING COUNT(d.reisnr) > 1
  121. ORDER BY k.naam
  122. OPGAVE
  123. Op welke planeten verblijft men gemiddeld langer dan 2 dagen? Sorteer op objectnaam.
  124.  
  125. OPLOSSING
  126. SELECT h.objectnaam, AVG(b.verblijfsduur)
  127. FROM bezoeken AS b
  128. INNER JOIN hemelobjecten AS h USING (objectnaam)
  129. WHERE h.satellietvan = 'Zon'
  130. GROUP BY h.objectnaam
  131. HAVING AVG(b.verblijfsduur) > 2
  132. ORDER BY h.objectnaam
  133. OPGAVE
  134. Maak een lijst met een overzicht van de reizen en het aantal deelnemers van elke reis. Orden de lijst dalend op basis van het aantal deelnemers, als er eenzelfde aantal deelnemers is, moeten deze stijgend geordend worden volgens reisnummer.
  135.  
  136. OPLOSSING
  137. SELECT reisnr, COUNT(klantnr) AS deelnemers
  138. FROM deelnames
  139. GROUP BY reisnr
  140. ORDER BY deelnemers DESC, reisnr;
  141. OPGAVE
  142. Maak een lijst met een overzicht van de reizen en het aantal deelnemers van elke reis. Orden de lijst dalend op basis van het aantal deelnemers, als er eenzelfde aantal deelnemers is, moeten deze stijgend geordend worden volgens reisnummer. Zorg dat reizen zonder deelnames ook in het resultaat staan.
  143.  
  144. OPLOSSING
  145. SELECT r.reisnr, COUNT(d.klantnr) AS deelnemers
  146. FROM reizen AS r
  147. LEFT OUTER JOIN deelnames AS d USING (reisnr)
  148. GROUP BY r.reisnr
  149. ORDER BY deelnemers DESC, r.reisnr;
  150. OPGAVE
  151. Welke klanten (klantnaam, geboortedatum) zijn op een ruimtereis vertrokken in het jaar dat ze 45 jaar geworden zijn? Het resultaat moet stijgend gesorteerd worden op de geboortedatum.
  152.  
  153. OPLOSSING
  154. SELECT k.naam AS klantnaam, k.geboortedatum
  155. FROM deelnames d
  156. INNER JOIN klanten k USING (klantnr)
  157. INNER JOIN reizen r USING (reisnr)
  158. WHERE EXTRACT(year FROM r.vertrekdatum) - EXTRACT(year FROM k.geboortedatum) = 45
  159. GROUP BY k.naam, k.geboortedatum
  160. ORDER BY geboortedatum
  161. OPGAVE
  162. Welke planeten met meer dan 7 manen worden bezocht (met of zonder verblijf)? Sorteer aflopend op basis van het aantal manen. Let erop dat je planeten die meerdere keren bezocht worden, niet dubbel telt.
  163.  
  164. OPLOSSING
  165. SELECT p.objectnaam
  166. FROM hemelobjecten AS p
  167. INNER JOIN hemelobjecten AS m ON m.satellietvan = p.objectnaam
  168. INNER JOIN bezoeken AS b ON b.objectnaam = p.objectnaam
  169. INNER JOIN hemelobjecten AS zon ON zon.objectnaam = p.satellietvan AND zon.satellietvan IS NULL
  170. GROUP BY p.objectnaam
  171. HAVING COUNT(distinct m.objectnaam) > 7
  172. ORDER BY COUNT(distinct m.objectnaam) DESC
  173. OPGAVE
  174. Geef een lijst met alle planeten en per planeet zijn satellieten. Sorteer op planeet en daarna op satelliet.
  175.  
  176. OPLOSSING
  177. SELECT p.objectnaam AS planeet, m.objectnaam AS maan
  178. FROM hemelobjecten AS p
  179. LEFT OUTER JOIN hemelobjecten AS m ON m.satellietvan = p.objectnaam
  180. WHERE p.satellietvan = 'Zon'
  181. ORDER BY planeet, maan
  182. OPGAVE
  183. Geef de leeftijd van de jongste klant op moment van vertrek.
  184.  
  185. OPLOSSING
  186. SELECT EXTRACT(year FROM min(age(r.vertrekdatum, k.geboortedatum))) AS jongsteleeftijd
  187. FROM deelnames AS d
  188. INNER JOIN reizen AS r USING (reisnr)
  189. INNER JOIN klanten AS k USING (klantnr)
  190. OPGAVE
  191. Geef de diameter van de grootste, niet bezochte maan (satelliet van een planeet).
  192.  
  193. OPLOSSING
  194. SELECT MAX(m.diameter) AS grootstemaan
  195. FROM hemelobjecten p
  196. INNER JOIN hemelobjecten m ON m.satellietvan = p.objectnaam
  197. LEFT OUTER JOIN bezoeken AS b ON b.objectnaam = m.objectnaam
  198. WHERE p.satellietvan = 'Zon' AND b.objectnaam IS NULL
  199. OPGAVE
  200. Geef voor elk hemelobject de minimale en maximale gemiddelde afstand tot zijn zon (de centrale ster in een sterrenstELSEl) als je weet dat de kolom 'afstand' de gemiddelde afstand bevat tot het hemelobject waarrond ze draaien. Met de grootte van het hemelobject hoef je geen rekening te houden. Sorteer op minimale afstand en op objectnaam.
  201.  
  202. OPLOSSING
  203. SELECT satelliet.objectnaam,
  204. CASE
  205.     WHEN satelliet.afstand IS NULL then 0
  206.     WHEN planeet.afstand IS NULL then satelliet.afstand
  207.     ELSE planeet.afstand + satelliet.afstand
  208. end AS maximale_afstand,
  209. CASE
  210.     WHEN satelliet.afstand IS NULL then 0
  211.     WHEN planeet.afstand IS NULL then satelliet.afstand
  212.     ELSE planeet.afstand - satelliet.afstand
  213. end  AS minimale_afstand
  214. FROM hemelobjecten satelliet
  215. LEFT OUTER JOIN hemelobjecten planeet ON planeet.objectnaam = satelliet.satellietvan
  216. ORDER BY minimale_afstand, satelliet.objectnaam
  217.  
  218. SELECT satelliet.objectnaam,
  219. COALESCE(planeet.afstand + satelliet.afstand, satelliet.afstand, 0) AS maximale_afstand,
  220. COALESCE(planeet.afstand - satelliet.afstand, satelliet.afstand, 0) AS minimale_afstand
  221. FROM hemelobjecten AS satellite
  222. LEFT OUTER JOIN hemelobjecten AS planeet ON planeet.objectnaam = satelliet.satellietvan
  223. ORDER BY minimale_afstand, satelliet.objectnaam
  224. OPGAVE
  225. Geef voor elke speler die een wedstrijd heeft gespeeld het spelersnr en het totaal aantal boetes. Spelers die een wedstrijd gespeeld hebben, maar geen boetes hebben, moeten ook getoond worden. Sorteer op het aantal boetes en op spelersnr;
  226.  
  227. OPLOSSING
  228. SELECT w.spelersnr, aantalboetes
  229. FROM wedstrijden AS w
  230. LEFT OUTER JOIN (SELECT spelersnr, COUNT(*) AS aantalboetes FROM boetes GROUP BY spelersnr) AS aboetes ON aboetes.spelersnr = w.spelersnr
  231. GROUP BY w.spelersnr, aantalboetes
  232. ORDER BY aantalboetes, w.spelersnr
  233. OPGAVE
  234. Geef voor alle spelers die geen penningmeester zijn of zijn geweest alle gewonnen wedstrijden, gesorteerd op wedstrijdnummer.
  235.  
  236. OPLOSSING
  237. SELECT w.spelersnr, w.wedstrijdnr
  238. FROM wedstrijden AS w
  239. WHERE w.gewonnen > w.verloren AND w.spelersnr NOT IN (SELECT spelersnr FROM bestuursleden WHERE functie='Penningmeester')
  240. ORDER BY w.wedstrijdnr
  241. OPGAVE
  242. Geef van elke speler het spelersnr, de naam en het verschil tussen zijn of haar jaar van toetreding en het gemiddeld jaar van toetreding van de spelers die in dezelfde plaats wonen. Sorteer op spelersnr. Toon 3 getallen na de komma, zet het verschil om naar het numeric type met precisie van 5 en een schaal van 3.
  243.  
  244. OPLOSSING
  245. SELECT s.spelersnr, s.naam, s.voorletters, round(jaartoe - (SELECT AVG(jaartoe) FROM spelers WHERE plaats = s.plaats), 3) AS numeric
  246. FROM spelers AS s
  247. ORDER BY 1;
  248. OPGAVE
  249. Je kan per speler berekenen hoeveel boetes die speler heeft gehad en wat het totaalbedrag per speler is. Pas nu deze querie aan zodat per verschillend aantal boetes wordt getoond hoe vaak dit aantal boetes voorkwam.Sorteer eerst op de eerste kolom en daarna op de tweede kolom.
  250.  
  251. OPLOSSING
  252. SELECT b1.aantalboetes AS a, COUNT(spelersnr)
  253. FROM (SELECT spelersnr, COUNT(*) AS aantalboetes FROM boetes GROUP BY spelersnr) AS b1
  254. GROUP BY b1.aantalboetes
  255. ORDER BY 1, 2
  256. OPGAVE
  257. Geef van alle spelers het verschil tussen het jaar van toetreding en het geboortejaar, maar geef alleen die spelers waarvan dat verschil groter is dan 20. Sorteer deze gegevens beginnend bij de eerste kolom, eindigend bij de laatste kolom.
  258.  
  259. OPLOSSING
  260. SELECT s.spelersnr, s.naam, s.voorletters, (jaartoe - EXTRACT(year FROM geb_datum)) AS toetredingsleeftijd
  261. FROM spelers AS s
  262. WHERE jaartoe - EXTRACT(year FROM geb_datum) > 20
  263. ORDER BY 1, 2, 3, 4
  264. OPGAVE
  265. Geef van elke speler het spelersnr, de naam en het verschil tussen zijn of haar jaar van toetreding en het gemiddeld jaar van toetreding van de spelers die in dezelfde plaats wonen. Sorteer op spelersnr. Zet het berekende verschil om naar het datatype numeric met precisie 5 en schaal 3.
  266.  
  267. OPLOSSING
  268. SELECT s.spelersnr, s.naam, s.voorletters, round(jaartoe - (SELECT AVG(jaartoe) FROM spelers WHERE plaats = s.plaats), 3) AS numeric
  269. FROM spelers AS s
  270. ORDER BY 1
  271. OPGAVE
  272. Geef een lijst van alle spelers (spelersnr en woonplaats) die met minstens twee in dezelfde plaats wonen. Sorteer aflopend op woonplaats.
  273.  
  274. OPLOSSING
  275. SELECT s.spelersnr, s.plaats
  276. FROM spelers AS s
  277. WHERE EXISTS (SELECT spelersnr FROM spelers WHERE plaats = s.plaats AND spelersnr <> s.spelersnr)
  278. ORDER BY s.plaats DESC
  279. OPGAVE
  280. Geef de spelersgegevens van de speler(s) met het hoogste bedrag (voor één boete, niet het totaalbedrag). Als twee spelers een even hoge boete gehad hebben, moeten beide spelers getoond worden (LIMIT is dus geen optie). Sorteer alfabetisch op naam en voorletters.
  281.  
  282. OPLOSSING
  283. SELECT s.spelersnr, s.voorletters, s.naam
  284. FROM boetes AS b
  285. INNER JOIN spelers AS s USING(spelersnr)
  286. WHERE b.bedrag = (SELECT MAX(bedrag) FROM boetes)
  287. ORDER BY 3,2
  288. OPGAVE
  289. Geef een lijst van alle hemelobjecten die meer keer bezocht gaan worden dan Jupiter. Sorteer op objectnaam.
  290.  
  291. OPLOSSING
  292. SELECT h.objectnaam, h.diameter
  293. FROM hemelobjecten AS h
  294. INNER JOIN bezoeken AS b ON b.objectnaam = h.objectnaam
  295. GROUP BY h.objectnaam, h.diameter
  296. HAVING COUNT(b.*) >
  297.     (SELECT COUNT(*)
  298.     FROM bezoeken
  299.     INNER JOIN hemelobjecten ON bezoeken.objectnaam = hemelobjecten.objectnaam
  300.     WHERE hemelobjecten.objectnaam = 'Jupiter')
  301. ORDER BY 1
  302. OPGAVE
  303. Geef het hemellichaam dat het laatst bezocht is. Gebruik hiervoor de laatste vertrekdatum van de reis en laatste volgnummer van bezoek. Tip: gebruik hiervoor een rij-subquery. Gebruik geen limit of top.
  304.  
  305. OPLOSSING
  306. SELECT objectnaam FROM bezoeken
  307. WHERE
  308. (reisnr, volgnr) = (
  309.     SELECT reisnr, MAX(volgnr)
  310.     FROM bezoeken
  311.     WHERE reisnr = (
  312.         SELECT reisnr
  313.         FROM reizen
  314.         WHERE vertrekdatum = (
  315.             SELECT MAX(vertrekdatum) AS vertrekdatum
  316.             FROM reizen
  317.             )
  318.         )
  319.     GROUP BY reisnr
  320.     )
  321. OPGAVE
  322. Geef het reisnr, de prijs en vertrekdatum van de reis met de hoogste gemiddelde verblijfsduur op een planeet (=som van de verblijfsduur / aantal bezoeken per reis).
  323.  
  324. OPLOSSING
  325. SELECT r.reisnr, r.prijs, r.vertrekdatum
  326. FROM    (
  327.     SELECT reisnr, SUM(verblijfsduur)/COUNT(volgnr) AS gem_duur
  328.     FROM bezoeken
  329.     GROUP BY reisnr
  330.     ) AS gemiddelde_duur
  331. INNER JOIN reizen AS r ON r.reisnr = gemiddelde_duur.reisnr
  332. WHERE gem_duur = (
  333.     SELECT MAX(gem_duur)
  334.     FROM (
  335.         SELECT reisnr, SUM(verblijfsduur)/COUNT(volgnr) AS gem_duur
  336.         FROM bezoeken
  337.         GROUP BY reisnr
  338.         ) AS gemiddelde_duur
  339.     )
  340. OPGAVE
  341. Geef de planeet (draait dus rond de zon) met de meeste satellieten. Sorteer op objectnaam.
  342.  
  343. OPLOSSING
  344. SELECT objectnaam
  345. FROM (
  346.     SELECT h.satellietvan AS objectnaam, COUNT(h.objectnaam) AS aantal_manen
  347.     FROM hemelobjecten AS h
  348.     WHERE h.satellietvan <> 'Zon'
  349.     GROUP BY h.satellietvan
  350.         ) AS aantal_manen
  351. WHERE aantal_manen = (
  352.     SELECT MAX(aantal_manen)
  353.     FROM    (
  354.         SELECT h.satellietvan AS objectnaam, COUNT(h.objectnaam) AS aantal_manen
  355.         FROM hemelobjecten AS h
  356.         WHERE h.satellietvan <> 'Zon'
  357.         GROUP BY h.satellietvan
  358.         ) AS aantal_manen
  359.     )
  360. ORDER BY objectnaam
  361. OPGAVE
  362. Geef het op één na kleinste hemellichaam. Je kan dit vinden door handig gebruik te maken van expliciete joins en een doorsnedevoorwaarde. Tip: probeer eerst een lijst te krijgen van alle hemelobjecten en het aantal hemellichaam dat kleiner is dan dat hemelobject.
  363.  
  364. OPLOSSING
  365. SELECT objectnaam, aantalkleiner
  366. FROM    (
  367.     SELECT hg.objectnaam, COUNT(hk.objectnaam) AS aantalkleiner
  368.     FROM hemelobjecten AS hg
  369.     INNER JOIN hemelobjecten AS hk ON hg.diameter > hk.diameter
  370.     GROUP BY hg.objectnaam
  371.     ) AS h
  372. WHERE aantalkleiner = 1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement