7 / 100 SEO Score

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 del WHERE (que filtra files individuals), el HAVING filtra 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.
  • AVG i ROUND: 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_alta per no penalitzar productes que s’acaben de pujar a la web avui mateix.

Resum de bones pràctiques utilitzades:

  1. Aliasing (c, o, p): Fa la consulta llegible i evita errors d’ambigüitat.
  2. Filtrat precoç: Utilitzar WHERE abans de GROUP BY per reduir el volum de dades a processar.
  3. Lògica de negoci: Totes les consultes responen a preguntes reals (“Qui gasta més?”, “Què no es ven?”).