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

Langage SQL Discussion :

requete sql: group by


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut requete sql: group by
    Salut à tous,

    Je suis débutant en ASP.NET et je voudrais savoir comment utiliser l'instruction GROUP BY dans une requête SQL.

    Ci-dessous la requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select a.ch1, a.ch2, a.ch3, a.ch4, b.ch7,
      sum(a.ch1*b.ch2), b.ch5, b.ch6 
    from table1 a,table b 
    where a.ch1=b.ch5 
    group by a.ch2.
    Aidez-moi s'il vous plaît.

  2. #2
    Membre confirmé Avatar de saad.hessane
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    315
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2008
    Messages : 315
    Points : 496
    Points
    496
    Par défaut
    Bonjour,

    Quand tu fais un GROUP BY, les champs que tu sélectionnes doivent obligatoirement se trouver dans le GROUP BY. Sinon ils doivent être passer à des fonctions d'aggrégation (comme Max ou Count...) en paramètre.
    Exemple :
    Code juste :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a FROM maTable GROUP BY a
    Code juste :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a, MAX(b) FROM maTable GROUP BY a
    Code faux :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT a, b FROM maTable GROUP BY a

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Tu auras tout ce qu'il faut savoir sur le GROUP BY dans les cours de SQLPro.
    Profites-en aussi pour jeter un coup d'oeil aux jointures dont la syntaxe normalisée depuis 1992 utilise le mot-clé JOIN.

  4. #4
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci à tous pour votre aide.
    Après avoir mis en oeuvre ce que vous m'avez dit, j'ai toujours un autre problème.
    Le message d'erreur est le suivant :
    GROUP BY clause is missing or invalid.
    Je précise que après SUM(), il y a encore des champs qui sont sélectionnés.

    Merci d'avance pour votre aide.

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Donne ta nouvelle requête et la structure de tes tables si tu veux qu'on puisse t'aider efficacement.

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    ci-dessous la requete:
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    select a.lib_cach, b.daterecep, c.lib_norme, i.raison_fou, d.lib_tr, 
      (h.no_group) as nolot,
      sum((h.nbsacevac*h.poidbrut)/h.nbsac) as poidbr_in,
      (e.nbsacs) as  bag_in,
      sum((h.nbsacevac*h.poidnetp)/h.nbsac) as poidfou_in,
      sum((h.nbsacevac*h.poidnet)/h.nbsac) as poidnet_in,
      (e.poidplein) as poidbr_st,
      (b.nbsac1) as bag_out,
      (e.poidnet) as poidnet_st,
      (e.ecartpoid) as freinte,
      ((e.ecartpoid/sum((h.nbsacevac*h.poidnet)/h.nbsac))*100) as freinte_pr,
      (b.prixbrut) as prix_usin, 
      00000 as stor_exlos,
      000000 as stor_exval,
      b.poidnet,
      b.poidbrut,
      0000 as trsp_exc,
      (b.poidbrut-b.poidnet-e.nbsacs) as fact_disc,
      00000000 as recov_val,
      (b.poidbrut-g.poidplein) as trsp_wlos,
      (((b.poidbrut-g.poidplein)/g.poidplein)*100) as trsp_wpr " & _
    from table1 a, table b, table3  c, table4 d, table5 e, table6 f, table7 g, table8 h, table9 i where a.cod_cach=b.cod_cach 
      and b.cod_tr=d.cod_tr 
      and b.cod_norme=c.cod_norme 
      and b.nobl_int=e.nobl_int 
      and e.nobl_int=f.nobl_int             
      and f.nolot=g.no_group 
      and g.no_group=h.no_group 
      and b.cod_fou=i.cod_fou 
      and b.cod_prod= w.vcod_prod.Trim & 
      and b.cod_mag>=w.vmagasi1.Trim  
      and b.cod_mag<=w.vmagasi2.Trim  
      and b.cod_exp>= w.vexportat1.Trim 
      and b.cod_exp<= w.vexportat2.Trim 
      and b.type_lot=1 
      and b.daterecep>= w.vdate1    
      and b.daterecep<= w.vdate2 
    group by a.lib_cach, b.daterecep, c.lib_norme, i.raison_fou, d.lib_tr, h.no_group, 
      e.nbsacs, e.poidplein, b.nbsac,e.poidnet, e.ecartpoid, b.prixbrut, 0000, 00000, 
      b.poidnet, b.poicbrut, 0000, (b.poidbrut-b.poidnet-e.nbsac), 00000000, 
      (b.poidbrut-g.poidplein), (((b.poidbrut-g.poidplein)/g.poidplein)*100)
    order by b.daterecep

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Apparemment, tu n'as pas appris les jointures normalisées !
    Voilà ce que ça donnerait avec ta requête et une petite mise en forme qui facilite la lecture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    from table2 b
    INNER JOIN table1 a ON a.cod_cach = b.cod_cach
    INNER JOIN table3 c ON b.cod_norme = c.cod_norme
    INNER JOIN table4 d ON b.cod_tr = d.cod_tr
    INNER JOIN table5 e ON b.nobl_int = e.nobl_int 
      INNER JOIN table6 f ON e.nobl_int = f.nobl_int
        INNER JOIN table7 g ON f.nolot = g.no_group
          INNER JOIN table8 h ON g.no_group = h.no_group
    INNER JOIN table9 i ON b.cod_fou = i.cod_fou
    Le problème est que juste après, le WHERE fait appel à une table d'alias w qui ne figure pas dans la liste des tables en jointure !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    where b.cod_prod= w.vcod_prod.Trim & 
      and b.cod_mag>=w.vmagasi1.Trim  
      and b.cod_mag<=w.vmagasi2.Trim  
      and b.cod_exp>= w.vexportat1.Trim 
      and b.cod_exp<= w.vexportat2.Trim
    Et c'est bizarre tout ces Trim !

    Venons-en au GROUP BY...
    On y trouve ceci b.nbsac alors que dans le SELECT il y a b.nbsac1.
    On y trouve aussi ce qui est probablement une faute de frappe : b.poicbrut alors que dans le SELECT il y a b.poidbrut.
    Les séries de zéros, ça fait toujours zéro ! Il faudrait les écrire sous forme de chaîne de caractères '0000'.
    Dans le GROUP BY : b.poidbrut-b.poidnet-e.nbsac mais dans le SELECT b.poidbrut-b.poidnet-e.nbsacs

    Votre requête complète récrite avec les jointures normalisées et une identation correcte. À vous de corriger les fautes.
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    SELECT a.lib_cach, b.daterecep, c.lib_norme, i.raison_fou, d.lib_tr, 
      (h.no_group) AS nolot,
      sum((h.nbsacevac*h.poidbrut)/h.nbsac) AS poidbr_in,
      (e.nbsacs) AS  bag_in,
      sum((h.nbsacevac*h.poidnetp)/h.nbsac) AS poidfou_in,
      sum((h.nbsacevac*h.poidnet)/h.nbsac) AS poidnet_in,
      (e.poidplein) AS poidbr_st,
      (b.nbsac1) AS bag_out,
      (e.poidnet) AS poidnet_st,
      (e.ecartpoid) AS freinte,
      ((e.ecartpoid/sum((h.nbsacevac*h.poidnet)/h.nbsac))*100) AS freinte_pr,
      (b.prixbrut) AS prix_usin, 
      00000 AS stor_exlos,
      000000 AS stor_exval,
      b.poidnet,
      b.poidbrut,
      0000 AS trsp_exc,
      (b.poidbrut-b.poidnet-e.nbsacs) AS fact_disc,
      00000000 AS recov_val,
      (b.poidbrut-g.poidplein) AS trsp_wlos,
      (((b.poidbrut-g.poidplein)/g.poidplein)*100) AS trsp_wpr " & _
    from table2 b
    INNER JOIN table1 a ON a.cod_cach = b.cod_cach
    INNER JOIN table3 c ON b.cod_norme = c.cod_norme
    INNER JOIN table4 d ON b.cod_tr = d.cod_tr
    INNER JOIN table5 e ON b.nobl_int = e.nobl_int 
      INNER JOIN table6 f ON e.nobl_int = f.nobl_int
        INNER JOIN table7 g ON f.nolot = g.no_group
          INNER JOIN table8 h ON g.no_group = h.no_group
    INNER JOIN table9 i ON b.cod_fou = i.cod_fou
    where b.cod_prod= w.vcod_prod.Trim & 
      and b.cod_mag>=w.vmagasi1.Trim  
      and b.cod_mag<=w.vmagasi2.Trim  
      and b.cod_exp>= w.vexportat1.Trim 
      and b.cod_exp<= w.vexportat2.Trim 
      and b.type_lot=1 
      and b.daterecep>= w.vdate1    
      and b.daterecep<= w.vdate2 
    group by a.lib_cach, b.daterecep, c.lib_norme, i.raison_fou, d.lib_tr, h.no_group, 
      e.nbsacs, e.poidplein, b.nbsac,e.poidnet, e.ecartpoid, b.prixbrut, 0000, 00000, 
      b.poidnet, b.poicbrut, 0000, (b.poidbrut-b.poidnet-e.nbsac), 00000000, 
      (b.poidbrut-g.poidplein), (((b.poidbrut-g.poidplein)/g.poidplein)*100)
    order by b.daterecep
    La coloration syntaxique n'aime pas non plus ceci : " & _

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2010
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci pour votre aide.
    Je voudrais souligner que les w. que vous voyez ne sont pas des alias mais plutôt des variables (w.vcod_prod.Trim &
    )décalrées en amont. Aussi je developpe en .NET, d'où les TRIM.

    Merci.

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

Discussions similaires

  1. Requete SQL group by interval
    Par hachka dans le forum Requêtes
    Réponses: 2
    Dernier message: 20/08/2010, 14h07
  2. Requete SQL : GROUP BY
    Par lassa0232 dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/07/2009, 11h59
  3. Requete SQL GROUP
    Par basson dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2008, 14h35
  4. requete sql group by
    Par DIDIDIDA dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 21/03/2008, 11h50
  5. [Requete][Sql]Vue et group by
    Par guignol dans le forum Langage SQL
    Réponses: 4
    Dernier message: 26/12/2005, 12h58

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