Per poder generar consultes SQL precises i optimitzades, necessitem un context: una base de dades d’exemple. Imaginem que gestionem una plataforma d’e-commerce amb tres taules principals: Clients, Comandes i Productes.
Aquí tens tres consultes de nivell avançat que cobreixen necessitats de negoci reals, explicades pas a pas.
1. Identificació de “Clients VIP” (Vendes acumulades)
Necessitat: El departament de màrqueting vol premiar els clients que han gastat més de 1.000€ en total, però només comptant aquells que han fet més de 3 comandes.
SQL
SELECT
c.nom,
c.email,
COUNT(o.id_comanda) AS total_comandes,
SUM(o.import_total) AS despesa_acumulada
FROM Clients c
INNER JOIN Comandes o ON c.id_client = o.id_client
WHERE o.estat = 'Pagat'
GROUP BY c.id_client, c.nom, c.email
HAVING SUM(o.import_total) > 1000 AND COUNT(o.id_comanda) > 3
ORDER BY despesa_acumulada DESC;
Per què es fa i què cobreix?
INNER JOIN: Relacionem les dades personals amb les transaccions. Sense això, només tindríem IDs numèrics sense sentit.GROUP BY: Agrupem totes les files de la taula de comandes per cada client individual per poder sumar els seus imports.HAVING: Aquesta és la clau. A diferència delWHERE(que filtra files individuals), elHAVINGfiltra resultats agregats. Només ens mostra els grups que compleixen les condicions de “VIP”.- Optimització: Filtrem primer pel
WHERE estat = 'Pagat'per no processar comandes cancel·lades, estalviant recursos de càlcul.
2. Rendiment de Categories (Mètriques de producte)
Necessitat: Saber quina categoria de productes és la més rendible i quants productes diferents s’han venut en cadascuna.
SQL
SELECT
p.categoria,
COUNT(DISTINCT p.id_producte) AS productes_cataleg,
SUM(o.quantitat) AS unitats_venudes,
ROUND(AVG(p.preu), 2) AS preu_mitja_categoria
FROM Productes p
LEFT JOIN Detalls_Comanda o ON p.id_producte = o.id_producte
GROUP BY p.categoria
ORDER BY unitats_venudes DESC;
Per què es fa i què cobreix?
LEFT JOIN: Fem servir un Join “esquerre” per incloure també aquelles categories que potser no han venut res encara. Si féssim un Join normal, les categories amb zero vendes desapareixerien del llistat.COUNT(DISTINCT ...): Ens assegurem de comptar quants productes únics existeixen en la categoria, no quantes vegades s’han venut.AVGiROUND: Calculem el preu mitjà per entendre el posicionament de la categoria (lux o baix cost) i arrodonim a 2 decimals per a un informe net.
3. Productes que mai s’han venut (Neteja d’estoc)
Necessitat: Identificar productes “morts” que ocupen espai al magatzem per fer una oferta de liquidació.
SQL
SELECT
p.nom,
p.stock,
p.data_alta
FROM Productes p
WHERE NOT EXISTS (
SELECT 1
FROM Detalls_Comanda dc
WHERE dc.id_producte = p.id_producte
)
AND p.data_alta < '2025-01-01';
Per què es fa i què cobreix?
WHERE NOT EXISTS: És una subconsulta altament optimitzada. En lloc de portar totes les dades, la base de dades només mira si hi ha una “correlació”. Si no troba el producte a la taula de vendes, el selecciona.- Necessitat de Negoci: Evita pèrdues econòmiques per estoc immobilitzat. Afegim el filtre de
data_altaper no penalitzar productes que s’acaben de pujar a la web avui mateix.
Resum de bones pràctiques utilitzades:
- Aliasing (
c,o,p): Fa la consulta llegible i evita errors d’ambigüitat. - Filtrat precoç: Utilitzar
WHEREabans deGROUP BYper reduir el volum de dades a processar. - Lògica de negoci: Totes les consultes responen a preguntes reals (“Qui gasta més?”, “Què no es ven?”).