|
||||
| SQL et les clauses de regroupement |
| Tutoriaux - SQL | ||||||||||||||||||||||||||||||||||||
|
Nous allons étudier ici aujourd'hui la notion de regroupement sous SQL à partir de la table suivante (qui est le début d'une table commande) ... La table commande
|
| Nom_client | Sum(Montantht) |
| DUPONT | 18064 |
| HENRI | 1334 |
| ANTOINE | 51 |
Note : DUPONT est de loin mon meilleur client
Quel est celui qui a effectué la plus grosse commande :
SQL="SELECT Nom_client, Max(Montanht) FROM commande GROUP by Nom_client"
Liste des commandes pour le mois de janvier : liste des clients, numéro du mois et montantht. Deux requêtes différentes si vous êtes sur Access ou Sql Server. Ici on ajoute un enregistrement à la clause de regroupement (ce qui n'est pas forcément utile pour la situation mais possible). Quand vous utilisez plusieurs enregistrements dans la clause Group_by les regroupements s'effectuent de gauche à droite. Plus vous ajoutez d'enregistrements dans la clause GROUP BY et plus vous précisez (augmentez en nombre de lignes de la sélection) votre requête.
Note : tout champ sélectionné non calculé doit faire partie du regroupement. Autrement dit :
SQL="SELECT Nom_client, date_commande, Max(Montanht) FROM commande GROUP by Nom_client"
provoque une erreur.
Avec Sql Server
SQL="SELECT Nom_client, DATEPART(month,date_commande) Max(Montanht) FROM commande WHERE DATEPART(month,date_commande)=1 GROUP by Nom_client, DATEPART(month,date_commande)"
Avec Access
SQL="SELECT Nom_client,DATEPART('m',date_commande), Max(Montanht) FROM commande WHERE DATEPART('m',date_commande)=1 GROUP by Nom_client,DATEPART('m',date_commande)"
On peut comme nous l'avons vu précédemment, utiliser une clause where au sein d'un regroupement , les enregistrements contenus dans cette clause ne faisant pas forcément parties de la fonction de regroupement. Ce qu'il faut retenir, c'est que la clause where est exécutée sur les lignes de la table utilisée pour la requête et non sur les lignes du regroupement généré... Donc impossible de connaître avec Where tout ceux dont le montant total ht a dépassé 500 F puisque ce nombre appartient au regroupement (somme calculée) et non à la table source.
On utilise une autre clause : HAVING s'utilise avec GROUP BY uniquement pour gérer ce type de situation. HAVING doit être placé après GROUP BY et doit contenir soit un nom de champ regroupé ou une fonction d'agrégation.
Quel sont ceux qui ont passé plus de 500 Fht total de commande:
SQL="SELECT Nom_client, Sum(Montanht) FROM commande GROUP by Nom_client HAVING SUM(Montanht)>500"
Cette requête retourne 2 enregistrements :
DUPONT - 18064 et HENRI - 1334



