5.7.2 Groepsfuncties Flashcards
Geef het aantal medewerkers per afdeling
SELECT afd, COUNT(mnr) aantal
FROM medewerkers
GROUP BY afd;
– Of als je echt de naam van de afdeling wilt tonen:
SELECT a.naam afdeling, COUNT(m.mnr) aantal
FROM medewerkers m
JOIN afdelingen a
ON m.afd = a.anr
GROUP BY a.naam
Geef het gemiddelde salaris per afdeling
SELECT afd, AVG(maandsal)
FROM medewerkers
GROUP BY afd;
Of als je echt de naam van de afdeling wilt tonen:
SELECT a.naam “afdeling”, AVG(m.maandsal) “gemiddeld salaris”
FROM medewerkers m
JOIN afdelingen a
ON m.afd = a.anr
GROUP BY a.naam;
Geef het aantal medewerkers per afdeling, maar enkel voor de afdelingen waar in de afdelingsnaam een OO zit
SELECT a.naam afdeling, COUNT(m.mnr) aantal
FROM medewerkers m
JOIN afdelingen a
ON m.afd = a.anr
WHERE a.naam LIKE ‘%OO%’
GROUP BY a.naam;
select m.afd, count(m.mnr)
from medewerkers m
where m.afd in
(select a.anr
from afdelingen a
where naam like ‘%OO%’)
group by m.afd;
Geef het aantal medewerkers voor alle afdelingen behalve de afdeling 10.
SELECT afd, COUNT(mnr) aantal
FROM medewerkers
WHERE afd != 10
GROUP BY afd;
Geef het maximum en het minimum salaris en de afdelingsnaam per afdeling
SELECT a.naam, MAX(m.maandsal), MIN(m.maandsal)
FROM medewerkers m
JOIN afdelingen a
ON m.afd = a.anr
GROUP BY a.naam;
Geef de naam en het salaris van de medewerker die het meest verdient.
SELECT naam, maandsal
FROM medewerkers
WHERE maandsal = (SELECT MAX(maandsal) FROM medewerkers);
Geef per afdeling en per functie het aantal medewerkers en het gemiddelde salaris.
SELECT afd, functie, COUNT(mnr), AVG(maandsal)
FROM medewerkers
GROUP BY afd, functie
ORDER BY afd, functie;
Geef per afdeling het gemiddelde salaris voor die afdelingen waar meer dan 3 medewerkers werken.
SELECT afd, AVG(maandsal)
FROM medewerkers
GROUP BY afd
HAVING COUNT(mnr) > 3;
Geef per afdeling de naam van de afdeling en de naam van de medewerker(s) die het meest verdient.
select a.naam, m.naam
from medewerkers m
join afdelingen a
on a.anr = m.afd
and m.maandsal in
(select max(mm.maandsal)
from medewerkers mm
where m.afd = mm.afd)
group by a.naam;
Geef de namen van de medewerkers die een hoger salaris hebben dan het gemiddelde
SELECT naam
FROM medewerkers
WHERE maandsal > (SELECT AVG(maandsal) FROM medewerkers);
Geef de namen van de medewerkers die een hoger salaris ehbben dan het gemiddelde salaris van hun afdelingen
SELECT m.naam
FROM medewerkers m
WHERE m.maandsal >
(SELECT AVG(mm.maandsal)
FROM medewerkers mm
WHERE m.afd = mm.afd
GROUP BY mm.afd);
Geef het aantal curussen die elke medewerker gevolgd heeft (stijgend gesorteerd).
SELECT m.naam, COUNT(i.cursus) aantal
FROM medewerkers m
LEFT JOIN inschrijvingen i
ON i.cursist = m.mnr
GROUP BY m.naam
ORDER BY aantal ASC;
We doen een LEFT JOIN voor ook de medewerkers die geen cursussen volgden!
Wat is het gemiddelde salaris van de medewerkers die in dezelfde afdeling werken als ‘Den Ruyter’?
SELECT AVG(m.maandsal) gemiddelde
FROM medewerkers m
WHERE m.afd IN
(SELECT mm.afd
FROM medewerkers mm
WHERE mm.naam = ‘DEN RUYTER’);
Hoeveel medewerkers verdienen minder dan het gemiddelde salaris plus 200
SELECT COUNT(m.mnr)
FROM medewerkers m
WHERE m.maandsal < (SELECT AVG(mm.maandsal) + 200 FROM medewerkers mm);
Hoe heten de drie hoogst betaalde medewerkers?
SELECT m.naam
FROM medewerkers m
WHERE 3 >=
(SELECT COUNT(mm.mnr)
FROM medewerkers mm
WHERE mm.maandsal >= m.maandsal);
– Even tussendoor, in MySQL of PostgreSQL kan dit echter véél korter:
SELECT naam
FROM medewerkers
ORDER BY maandsal DESC
LIMIT 3;
– Of vanaf Oracle 12.1 en later volgens de ANSI/ISO standaard:
– (Stel dat je zit op Oracle 11, werkt dit niet…)
SELECT naam
FROM medewerkers
ORDER BY maandsal DESC
FETCH NEXT 3 ROWS ONLY;
Wat zijn de namen en de salarissen van de vijf laagst betaalde medewerkers?
SELECT m.naam, m.maandsal
FROM medewerkers m
WHERE 5 >=
(SELECT COUNT(mm.mnr)
FROM medewerkers mm
WHERE mm.maandsal <= m.maandsal);
Idem vraag 16 maar sorteer het resultaat dalend op salaris.
SELECT m.naam, m.maandsal
FROM medewerkers m
WHERE 5 >=
(SELECT COUNT(mm.mnr)
FROM medewerkers mm
WHERE mm.maandsal <= m.maandsal)
ORDER BY m.maandsal DESC;
Hoe heten de 3 meest verdiende verkopers?
SELECT m.naam
FROM medewerkers m
WHERE
m.functie = ‘VERKOPER’ AND
3 >=
(SELECT COUNT(mm.mnr)
FROM medewerkers mm
WHERE mm.functie = ‘VERKOPER’ AND mm.maandsal >= m.maandsal);
Welke is van alle gemiddelde maandsalarissen per afdeling het hoogste gemiddelde maandsalaris?
SELECT MAX(AVG(maandsal))
FROM medewerkers
GROUP BY afd;
SELECT MAX(sub.gemiddelde) AS gemiddelde
FROM
(SELECT AVG(maandsal) gemiddelde
FROM medewerkers
GROUP BY afd) sub;
Welke afdeling (naam) heeft het hoogste gemiddelde maandsalaris?
SELECT a.naam
FROM afdelingen a
JOIN medewerkers m
ON a.anr = m.afd
GROUP BY a.naam
HAVING
AVG(m.maandsal) =
(SELECT MAX(AVG(mm.maandsal))
FROM medewerkers mm
GROUP BY mm.afd);
Op welke datum is voor het laatst een cursus gepland?
SELECT MAX(begindatum)
FROM uitvoeringen;
Of meer informatie tonen:
SELECT cursus, begindatum, locatie
FROM uitvoeringen
JOIN
(SELECT MAX(begindatum) laatste
FROM uitvoeringen) u
ON begindatum = u.laatste;
22) Geef de resultaatqueries zoals beschreven in de syllabus.
break on afd skip 1;
compute avg label ‘GEMIDDELDE’ of avg(maandsal) on afd;
compute count label ‘AANTAL’ of count(mnr) on afd;
select afd, functie, count(mnr), avg(maandsal)
from medewerkers
group by afd, functie
order by afd, functie;
clear computes;
clear breaks;