Liste
Exemples de requêtes SQL pour dirigeant, annotés
Dix questions de dirigeant de PME et la requête SQL qui y répond, annotée ligne par ligne, pour savoir relire ce qu'un outil d'IA écrit à votre place.
Mis à jour le
Voici dix questions qu'un dirigeant de PME pose souvent à ses données, chacune avec une requête SQL (langage de requête structuré) qui y répond et une note sur ce qu'il faut vérifier. Les exemples sont illustratifs : ils supposent une base simple, décrite dans notre exemple de schéma, avec les tables clients, commandes, lignes_commande, produits et devis. Ils sont écrits pour PostgreSQL ; les fonctions de date changent un peu d'un logiciel à l'autre.
1. Combien de commandes ce mois-ci ?
SELECT count(*)
FROM commandes
WHERE date_commande >= date_trunc('month', current_date);
current_date est la date du jour ; date_trunc('month', …) la ramène au premier jour du mois. À vérifier : la colonne de date (commande, livraison ou facture ?).
2. Chiffre d'affaires hors taxes par mois en 2026
SELECT date_trunc('month', date_commande) AS mois,
sum(montant_ht) AS ca_ht
FROM commandes
WHERE date_commande >= '2026-01-01' AND date_commande < '2027-01-01'
GROUP BY mois
ORDER BY mois;
À vérifier : montant_ht et non un montant toutes taxes ; les commandes annulées sont-elles exclues ? Si la table a un statut, il manque sans doute AND statut <> 'annulée'.
3. Quels clients n'ont pas commandé depuis 90 jours ?
SELECT c.nom, max(o.date_commande) AS derniere_commande
FROM clients c
JOIN commandes o ON o.client_id = c.id
GROUP BY c.nom
HAVING max(o.date_commande) < current_date - 90
ORDER BY derniere_commande;
La documentation de PostgreSQL montre qu'on peut retirer un nombre de jours à une date. À vérifier : HAVING porte sur la dernière commande de chaque client, pas sur chaque commande. Les clients qui n'ont jamais commandé n'apparaissent pas ici (voir l'exemple 4).
4. Quels clients n'ont jamais commandé ?
SELECT c.nom
FROM clients c
LEFT JOIN commandes o ON o.client_id = c.id
WHERE o.id IS NULL;
À vérifier : le LEFT. PostgreSQL l'explique : une jointure externe gauche garde les lignes de la première table même sans correspondance, en laissant vides les colonnes de l'autre. IS NULL garde justement ces lignes vides.
5. Les 10 meilleurs clients de l'année
SELECT c.nom, sum(o.montant_ht) AS total_ht
FROM clients c
JOIN commandes o ON o.client_id = c.id
WHERE o.date_commande >= '2026-01-01'
GROUP BY c.nom
ORDER BY total_ht DESC
LIMIT 10;
À vérifier : ORDER BY … DESC avant LIMIT. La documentation de PostgreSQL prévient qu'un LIMIT sans tri renvoie un sous-ensemble imprévisible.
6. Panier moyen par mois
SELECT date_trunc('month', date_commande) AS mois,
avg(montant_ht) AS panier_moyen_ht
FROM commandes
GROUP BY mois
ORDER BY mois;
À vérifier : la moyenne porte sur les commandes, pas sur les lignes de commande. Si la requête part de lignes_commande, elle calcule la moyenne d'une ligne, ce qui est beaucoup plus bas.
7. Produits les plus vendus en quantité
SELECT p.libelle, sum(l.quantite) AS quantite_vendue
FROM lignes_commande l
JOIN produits p ON p.id = l.produit_id
GROUP BY p.libelle
ORDER BY quantite_vendue DESC
LIMIT 20;
À vérifier : quantité ou montant ? « Les plus vendus » n'a pas le même classement selon le cas. Précisez-le dans votre question.
8. Devis envoyés il y a plus de 15 jours, toujours ouverts
SELECT numero, client_id, date_envoi, montant_ht
FROM devis
WHERE statut = 'envoyé'
AND date_envoi < current_date - 15
ORDER BY date_envoi;
À vérifier : la valeur exacte du statut. Si la base écrit ENVOYE ou 2, le filtre 'envoyé' ne trouvera rien, et la requête répondra « aucun devis » sans erreur.
9. Nombre de nouveaux clients par mois
SELECT date_trunc('month', date_creation) AS mois, count(*) AS nouveaux
FROM clients
GROUP BY mois
ORDER BY mois;
À vérifier : date_creation est-elle la date de la fiche ou la date de la première commande ? Une fiche créée pour un simple devis compte ici comme un nouveau client.
10. Clients en double (même adresse mail)
SELECT email, count(*) AS nombre
FROM clients
GROUP BY email
HAVING count(*) > 1;
À vérifier : les mails vides. S'il y a beaucoup de fiches sans adresse mail, elles forment souvent un faux « doublon » géant.
Ce que ces exemples ont en commun
- Chaque erreur possible donne un chiffre, pas un message d'erreur. C'est pourquoi on relit.
- Les points fragiles reviennent toujours : la colonne de date, le statut, hors taxes ou toutes taxes, la jointure, le tri avant la limite.
- Un mot de votre question qui ne se retrouve pas dans la requête (« ouverts », « hors taxes », « jamais ») est le premier signal d'alerte.
Pour lire chaque mot, voyez comprendre une requête SQL. Pour la méthode de contrôle complète, voyez vérifier une requête SQL générée par l'IA.
Questions fréquentes
Ces requêtes fonctionnent-elles sur ma base ?
Pas telles quelles : elles sont illustratives et supposent des tables nommées clients, commandes, lignes_commande, produits et devis. Les noms de votre base seront différents, et certaines fonctions de date varient d'un logiciel de base de données à l'autre.
À quoi servent ces exemples si je n'écris pas de SQL ?
À reconnaître la forme d'une requête juste. Quand un outil d'IA vous propose une requête pour la même question, vous comparez : mêmes tables, même filtre, même regroupement.
Sources
Pages consultées pour écrire cet article :