IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Utilisation de la clause GROUP BY [2012]


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut Utilisation de la clause GROUP BY
    Bonjour,

    j'ai commencé la lecture du livre Training Kit MSSQL2012.
    Je bloque dès le début... page 21.

    L'exercice propose d'étudier la requête suivante:
    SELECT custid, orderid FROM Sales.Orders GROUP BY custid;
    Cette dernière n'aboutit pas et renvoie le message suivant:
    La colonne 'Sales.Orders.orderid' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.


    La table est définie comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    CREATE TABLE [Sales].[Orders](
    	[orderid] [int] IDENTITY(1,1) NOT NULL,
    	[custid] [int] NULL,
    	[empid] [int] NOT NULL,
    	[orderdate] [datetime] NOT NULL,
    	[requireddate] [datetime] NOT NULL,
    	[shippeddate] [datetime] NULL,
    	[shipperid] [int] NOT NULL,
    	[freight] [money] NOT NULL,
    	[shipname] [nvarchar](40) NOT NULL,
    	[shipaddress] [nvarchar](60) NOT NULL,
    	[shipcity] [nvarchar](15) NOT NULL,
    	[shipregion] [nvarchar](15) NULL,
    	[shippostalcode] [nvarchar](10) NULL,
    	[shipcountry] [nvarchar](15) NOT NULL,
     CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
    Voici la correction:
    SELECT custid, MAX(orderid) AS maxorderid FROM Sales.Orders GROUP BY custid;

    Je ne comprends pas en quoi la correction correspond au besoin initial.
    Dans cette correction, on ne récupère que les "orderid max" par client et non pas tous les orderid par client...
    Comment aurait-on pu récupérer tous les orderid pour chaque client?

    J'ai essayé SELECT custid, orderid FROM Sales.Orders GROUP BY custid,orderid; mais ça ne s'affiche pas comme j'aimerais...
    N'hésitez pas à demander des précisions si je ne suis pas clair.
    Je vous remercie d'avance pour votre aide.

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 075
    Points
    28 075
    Par défaut
    Ben justement, à partir du moment ou tu fais un GROUP BY, c'est que tu ne veux pas récupérer tous les enregistrements, mais seulement une information propre à un groupe d'enregistrement.

    Dans le cas présent, pour chaque groupe de custid (à comprendre "pour chaque client") tu veux récupérer le orderid le plus élevé (comprendre probablement "la dernière commande").
    Il te faut donc regrouper par client (GROUP BY) et, pour chaque groupe obtenu, agréger les "autres" données pour en retirer l'info souhaitée. Ici l'agrégation se produit par la fonction MAX() qui va passer en revue toutes les données du groupe pour en rendre seulement la plus élevée.

    Pour que cela marche, il faut évidemment que toutes les données qui ne vont pas être agrégées rentrent dans le groupement, et donc à l'inverse toute donnée qui n'est pas regroupée doit donc faire l'objet d'une fonction d'agrégation pour en extraire la substentifique moelle l'information voulue
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    je te remercie pour ta réponse

    en fait, la "mésentente" avait lieu sur ce qu'on voulait obtenir... pour moi on voulait toutes les commandes regroupées par client!

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Un groupage n'a aucun sens sans un agrégat. Ce que vous présentez comme un groupage :
    "on voulait toutes les commandes regroupées par client! "
    est en fait un simple tri (ORDER BY).

    Ne confondez pas GROUP BY et ORDER BY ! Cela n'a rien à voir et la présentation des résultats à toute les chances d'être très différente.
    Hélas, bien des internautes qui n'ont rien compris aux bases de données relationnelles ni au langage SQL présentent souvent l'un pour l'autre y compris dans de pseudo tutoriaux !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 137
    Points : 56
    Points
    56
    Par défaut
    merci!

    j'ai regardé ça de plus près et effectivement, je comprends ce que vous dites

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/03/2012, 09h38
  2. Utilisation invalide de la clause GROUP
    Par evevev dans le forum Requêtes
    Réponses: 18
    Dernier message: 12/06/2009, 16h54
  3. Réponses: 4
    Dernier message: 05/04/2009, 22h39
  4. Utilisation de la clause group by
    Par kroma23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 17/09/2008, 12h53
  5. [ODBC] Problème d'utilisation de la clause LIMIT
    Par Thierry8 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 14/10/2005, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo