Guide for Empleats 5: Agrupant dades
Com abordar aquest problema
Fins ara les funcions d'agregat resumien tota la taula en una fila. Amb GROUP BY la taula es divideix en grups (un per cada valor diferent d'una columna) i obtens una fila per grup. Amb HAVING pots descartar grups sencers. Cada pregunta té el seu propi quadre de text: escriu-hi una sola consulta SELECT (sense res més) per a cada pregunta.
La sintaxi que necessites
SELECT columna_de_grup, FUNCIO(columna)
FROM taula
WHERE condició_sobre_files -- opcional, abans d'agrupar
GROUP BY columna_de_grup
HAVING condició_sobre_el_grup; -- opcional, després d'agrupar
GROUP BY: ajunta les files que tenen el mateix valor en aquella columna.- Al
SELECThi pots posar la columna de grup i funcions d'agregat (COUNT,SUM,AVG,MIN,MAX), que es calculen dins de cada grup. WHEREfiltra files abans d'agrupar;HAVINGfiltra grups després, i pot fer servir funcions d'agregat (p. ex.HAVING COUNT(*) > 3).
Pregunta per pregunta
Pregunta 1. Una fila per càrrec: agrupa per la columna del càrrec i compta quantes files té cada grup. Primer la columna del càrrec, després el comptatge.
Pregunta 2. La mateixa agrupació, però en lloc de comptar has de trobar el valor més gran d'una altra columna dins de cada grup.
Pregunta 3. Una fila per càrrec amb una mitjana, però només per als grups que tenen més d'un empleat. Aquesta condició és sobre el grup (quantes files té), no sobre cada fila: pensa si va al WHERE o al HAVING. Fixa't que la condició fa servir una funció diferent de la que es mostra.
Un exemple semblant
Per a cada salari diferent, quants empleats el cobren:
SELECT Salary, COUNT(*)
FROM Employees
GROUP BY Salary;
El mateix, però només per als salaris que cobren dos o més empleats:
SELECT Salary, COUNT(*)
FROM Employees
GROUP BY Salary
HAVING COUNT(*) >= 2;
Paranys habituals:
- Una condició amb
COUNT,AVG... no pot anar alWHERE: va alHAVING. - Si poses al
SELECTuna columna que no és alGROUP BYni dins d'una funció, SQLite no dona error però et torna un valor qualsevol del grup: evita-ho. - L'ordre de les columnes del
SELECTcompta; l'ordre de les files no (no calORDER BY). HAVINGva després deGROUP BY, mai abans.