Guide for Miniwind 8: JOINs amb filtres i agrupacions
Com abordar aquest problema
Combines JOIN i GROUP BY: primer uneixes dues taules per tenir la informació junta, i després agrupes les files resultants per calcular un total o un recompte per a cada grup (per empleat, per client, per categoria...).
La sintaxi que necessites
SELECT a.nom, COUNT(*), SUM(b.import)
FROM taula_a a
INNER JOIN taula_b b ON b.a_id = a.id
WHERE condicio_opcional
GROUP BY a.id, a.nom;
- L'ordre en què s'executa és:
FROM+JOIN→WHERE→GROUP BY→ funcions d'agregació (COUNT,SUM...) →SELECT. - És bona idea agrupar per la clau (
a.id) i pel nom: dos elements diferents podrien tenir el mateix nom, i si agrupes només pel nom els barrejaries. - Amb
INNER JOIN, els elements sense cap fila relacionada desapareixen, cosa que aquí és precisament el que demanen ("només els que en tinguin").
Pregunta per pregunta
Pregunta 1. Uneix empleats i comandes per la relació "qui l'ha gestionada", agrupa per empleat i compta. Dues columnes: cognom i recompte.
Pregunta 2. La mateixa estructura, però ara la relació és entre clients i comandes, i en lloc de comptar cal sumar una columna de les comandes. Recorda agrupar per client (la clau), no només pel nom.
Pregunta 3. La categoria no és una taula: és una columna de text dels productes. Cal unir productes amb les línies de comanda, agrupar per aquesta columna i sumar la quantitat de les línies.
Un exemple semblant
Nombre de comandes en cada estat:
SELECT s.status_name, COUNT(*)
FROM orders_status s
INNER JOIN orders o ON o.status_id = s.id
GROUP BY s.id, s.status_name;
Nombre de línies de comanda de cada producte, comptant només les línies amb quantitat de 50 o més:
SELECT p.product_name, COUNT(*)
FROM products p
INNER JOIN order_details d ON d.product_id = p.id
WHERE d.quantity >= 50
GROUP BY p.id, p.product_name;
Paranys habituals:
- Oblidar el
GROUP BY: amb una funció d'agregació, SQLite retorna una sola fila per a tota la taula. - Unir per la clau equivocada (per exemple, igualar
o.idambe.id): els recomptes surten però no tenen sentit. - Sumar una columna de la taula equivocada: pensa a quina taula viu el valor que vols totalitzar.
- El jutge no mira els noms de les columnes ni l'ordre de les files, però sí el nombre de columnes i el seu ordre: no afegeixis columnes "de regal" (com l'identificador) si no te les demanen.