Tutoriaux
Écrit par Administrator    Lundi, 03 Décembre 2007 03:55    PDF Imprimer Envoyer
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

id_commande date_commande Nom_client MontantHT ...
1 01/01/2000 17:20:30 DUPONT 412
2 03/01/2000 14:12:02 HENRI 1234
3 10/01/2000 17:20:30 DUPONT 3152
4 12/01/2000 17:20:30 ANTOINE 51
5 13/01/2000 14:12:02 HENRI 100
3 14/01/2000 17:20:30 DUPONT 14500


Regroupement d'enregistrement : GROUP BY

Le regroupement d'enregistrement s'utilise au sein d'une requête SQL. Son fonctionnement reste le même que vous utilisiez SQL Server ou Access. Il permet de mesurer la quantité de certains champs répondants à un ou plusieurs critères défini par d'autres champs de la même table.

Fonctions d'agrégations utilisées dans des clauses Group By

  • SUM(exp) :
         Effectue la somme des valeurs de la colonne exp
  • AVG(exp) :
         Effectue la moyenne des valeurs de la colonne exp
  • COUNT(exp) :
         Compte le nombre de valeurs non null trouvées dans la colonne exp
  • MAX(exp) :
         Sélectionne le maximum des valeur de la colonne exp
  • MIN(exp) :
         Sélectionne le minimum des valeurs de la colonne exp

Exemple :

Montant total des commandes de DUPONT :

SQL="SELECT Nom_client, Sum(Montanht) FROM commande WHERE Nom_client='DUPONT' GROUP by Nom_client"

Note : En asp une fois mon recordset ouvert sur cette requête, j'aurais accès à deux champs : rs(0) et rs(1), rs(0) étant le nom du client et rs(1) son total hors taxe commandé.

 

Enlevons la clause Where à cette requête, elle devient :

SQL="SELECT Nom_client, Sum(Montanht) FROM commande GROUP by Nom_client"

Cette requête permet d'établir la liste des montant ht (somme) par client, les données générées auront la forme suivante :

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
 

Rétrolien(0)

Adresse URI pour un rétrolien sur cet article

Commentaires (0)

Flux RSS pour les commentaires

Ecrivez un commentaire

Réduire l'éditeur | Agrandir l'éditeur

busy
Mis à jour ( Lundi, 03 Décembre 2007 03:58 )
 

Derniers ajout

Les plus lus