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

WinDev Discussion :

hexecuterequetesql SUM et GROUP BY [WD15]


Sujet :

WinDev

  1. #1
    Membre à l'essai
    Homme Profil pro
    Apprenti BTS Developpeur d'Applications
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti BTS Developpeur d'Applications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 21
    Points
    21
    Par défaut hexecuterequetesql SUM et GROUP BY
    Bonjour à tours,

    Je souhaite lorsque dans ma table1(Appel) j'ai le champ affaire en doublons et le champ doc_achat en doublon, regrouper ces ligne en quelque sorte en une seule dans ma table2(Consultationao), voici la syntaxe utilisé et voici mon message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(test1,"INSERT INTO Consultationao SELECT hier_cp,div1,doc_achat,affaire,des_projet,gm,designation,code_ach,acheteur,qte_cdee,SUM(prix_ligne_da),date_cde,txt_addition1,txt_addition2,1,1,statut,fourn,nom_fourn,SUM(prix_net_ao),date1prix_ao,SUM(prix1_ao),date2prix_ao,iteration,des_pays,pays,SUM((dem_achat*dem_achat)*(poste_achat*poste_achat)),type_da,supp_da FROM Appel WHERE statut='A' AND supp_da<>'X' GROUP BY affaire,doc_achat")
    Erreur dans le code SQL de la requête <SOUSREQUETE_FROM_02558EF0>. Initialisation de la requête impossible.
    L'utilisation de fonctions agrégats avec d'autres rubriques ou fonctions non agrégat n'est pas autorisée sans l'utilisation d'une clause GROUP BY. Toutes les rubriques ou fonctions non agrégat doivent figurer dans la clause GROUP BY.

    Ou est mon erreur?

    Cordialement,

  2. #2
    Membre expérimenté
    Inscrit en
    Août 2010
    Messages
    726
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 726
    Points : 1 645
    Points
    1 645
    Par défaut
    Bonjour,

    Si je trouve 2 "hier_cp" différents pour un même couple "affaire,doc_achat", je prends lequel ?
    Vous auriez pu :
    - Ecrire "MIN(hier_cp)"
    - Faire un GROUP BY sur "hier_cp,affaire,doc_achat"
    - Ne pas prendre "hier_cp" si vous n'en aviez pas besoin

    Et bien sûr vous avez le même problème sur toutes les autres rubriques qui ne sont pas dans un SUM, MIN, MAX etc. et pas non plus dans le GROUP BY.

    Pour être plus clair, voici un exemple :
    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
    Table :
     
    hier_cp | affaire | doc_achat | prix_ligne_da
    --------|---------|-----------|---------------
    toto    | 42      | BOB       | 1
    toto    | 51      | BOB       | 1
    titi    | 51      | BOB       | 1
    tata    | 13      | BOB       | 1
    tutu    | 13      | BOB       | 2
     
    Résultat de la requête :
     
    hier_cp        | affaire | doc_achat | SUM(prix_ligne_da)
    ---------------|---------|-----------|-------------------
    toto           | 42      | BOB       | 1
    toto ou titi ? | 51      | BOB       | 2
    tata ou tutu ? | 13      | BOB       | 3

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonsoir,
    J'ajouterai que le message d'erreur est clair:
    "L'utilisation de fonctions agrégats avec d'autres rubriques ou fonctions non agrégat n'est pas autorisée sans l'utilisation d'une clause GROUP BY. Toutes les rubriques ou fonctions non agrégat doivent figurer dans la clause GROUP BY"
    Donc toutes les rubriques qui ne dont pas l'objet d'un SUM, AVG, MIN... doivent être dans le group by.
    Or dans ta requête:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT hier_cp,div1,doc_achat,affaire,des_projet,gm,designation,code_ach,acheteur,qte_cdee,SUM(prix_ligne_da),date_cde,txt_addition1,txt_addition2,1,1,statut,fourn,nom_fourn,SUM(prix_net_ao),date1prix_ao,SUM(prix1_ao),date2prix_ao,iteration,des_pays,pays,SUM((dem_achat*dem_achat)*(poste_achat*poste_achat)),type_da,supp_da FROM Appel WHERE statut='A' AND supp_da<>'X' GROUP BY affaire,doc_achat

    Ce n'est pas le cas. Il manque par exemple designation, code_ach, acheteur...

    Tatayo.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Apprenti BTS Developpeur d'Applications
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti BTS Developpeur d'Applications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 21
    Points
    21
    Par défaut
    Bonjours, merci pour vos réponses,

    J'ai donc ajouter des aggrégats devant chaque champs appellés mais sans résultats :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO Consultationao SELECT MAX (hier_cp),MAX (div1),MAX (doc_achat),MAX (affaire),MAX (des_projet),MAX (gm),MAX (designation),MAX (code_ach),MAX (acheteur),MAX (qte_cdee),SUM (prix_ligne_da),MAX (date_cde),MAX (txt_addition1),MAX (txt_addition2),MAX (1),MAX (1),MAX (statut),MAX (fourn),MAX (nom_fourn),SUM (prix_net_ao),MAX (date1prix_ao),SUM (prix1_ao),MAX (date2prix_ao),MAX (iteration),MAX (des_pays),MAX (pays),SUM ((dem_achat*dem_achat)*(poste_achat*poste_achat)),MAX (type_da),MAX (supp_da) FROM Appel WHERE statut='A' AND supp_da<>'X' GROUP BY affaire,doc_achat")
    Ceci devrait pourtant marcher?

    Cordialement,

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Oui et non, tout dépend de ce que tu veux faire.
    Est-ce que tu veux réellement la valeur maximum de ces rubriques, ou un regroupement sur ces valeurs ? Ce n'est pas la même chose...

    Tatayo.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Apprenti BTS Developpeur d'Applications
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti BTS Developpeur d'Applications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 21
    Points
    21
    Par défaut
    Effectivement je ne veux pas la valeur MAX mais un regroupement depuis toutes ces valeurs même si je souhaite seulement un regroupement à partir de affaire et doc_achat je veux que les valeurs suivent lorsque je fait un insert dans la table.

    Ducoup j'ai fait sa, est-ce bon?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HExécuteRequêteSQL(test2,"INSERT INTO Consultationao SELECT hier_cp,div1,doc_achat,affaire,des_projet,gm,designation,code_ach,acheteur,qte_cdee,SUM(prix_ligne_da),date_cde,txt_addition1,txt_addition2,1,1,statut,fourn,nom_fourn,SUM(prix_net_ao),date1prix_ao,SUM(prix1_ao),date2prix_ao,iteration,des_pays,pays,SUM((dem_achat*dem_achat)*(poste_achat*poste_achat)),type_da,supp_da FROM Appel WHERE statut='A' AND supp_da<>'X' GROUP BY date2prix_ao,iteration,des_pays,pays,date1prix_ao,date_cde,txt_addition1,txt_addition2,1,1,statut,fourn,nom_fourn,des_projet,gm,designation,code_ach,acheteur,qte_cdee,hier_cp,div1,affaire,doc_achat,type_da,supp_da")
    Merci de tes réponses.

    Cordialement

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    A vue de nez oui, si toutes les colonnes que tu en sommes pas sont bien dans la clause group by.

    Tatayo.

  8. #8
    Membre à l'essai
    Homme Profil pro
    Apprenti BTS Developpeur d'Applications
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti BTS Developpeur d'Applications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 21
    Points
    21
    Par défaut
    Et pourtant sans résultat, message d'erreur suivant :

    L'erreur suivante a été renvoyée par la base données <localhost> :
    Numéro d'erreur = <1064>.
    Message d'erreur :
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`appel`.`hier_cp``appel`.`div1``appel`.`doc_achat``appel`.`affaire``appel`.`des_' at line 1

    Il y a une synxtaxe qui ne va pas mais je ne sais pas dutout laquelle.
    (Ps : doit-je aussi mettre tout les champs de ma table Consultationao ou de Appel? Ou seulement ceux appelés?)

    Cordialement, merci de tes réponses rapides.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Il faut dire aussi que le message d'erreur est vachement explicite

    La norme veux que toutes les colonnes renvoyées qui ne sont pas aggrégées soient dans le group by. Pour nuancer un peu, je dirai que les constantes sont inutiles ici.

    Je dirai aussi que tu devrais lister les colonnes de Consultationao dans la clause Insert, sinon tu risques fort d'avoir des surprises si la structure de cette table change (quoi qu'avec MySql il faut s'attendre à tout et n'importe quoi).
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    INSERT INTO Consultationao // ici il manque la liste des colonnes cibles
    SELECT hier_cp,div1,doc_achat,affaire,des_projet,gm,designation,code_ach,acheteur,qte_cdee,SUM(prix_ligne_da),date_cde,txt_addition1,txt_addition2,1,1,statut,fourn,nom_fourn,SUM(prix_net_ao),date1prix_ao,SUM(prix1_ao),date2prix_ao,iteration,des_pays,pays,SUM((dem_achat*dem_achat)*(poste_achat*poste_achat)),type_da,supp_da
    FROM Appel
    WHERE statut='A' AND supp_da<>'X'
    GROUP BY hier_cp,div1,doc_achat,affaire,des_projet,gm,designation,code_ach,acheteur,qte_cdee,date_cde,txt_addition1,txt_addition2,statut,fourn,nom_fourn,date1prix_ao,date2prix_ao,iteration,des_pays,pays,type_da,supp_da

    Tatayo.

  10. #10
    Membre à l'essai
    Homme Profil pro
    Apprenti BTS Developpeur d'Applications
    Inscrit en
    Janvier 2012
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Apprenti BTS Developpeur d'Applications

    Informations forums :
    Inscription : Janvier 2012
    Messages : 36
    Points : 21
    Points
    21
    Par défaut
    Merci a toi pour tes réponses, voici ma solution qui (je ne c'est pas pourquoi) utilise la même syntaxe mais fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLExec("INSERT INTO Consultationao SELECT hier_cp, div1, doc_achat, affaire, des_projet, gm,designation ,code_ach ,acheteur ,qte_cdee ,SUM(prix_ligne_da),date_cde,txt_addition1,txt_addition2,1,1,statut,fourn,nom_fourn,SUM(prix_net_ao),date1prix_ao,SUM(prix1_ao),date2prix_ao,iteration,des_pays,pays,SUM((dem_achat*dem_achat)*(poste_achat*poste_achat)),type_da,supp_da FROM Appel WHERE statut='A' AND supp_da<>'X' GROUP BY affaire,doc_achat","Test")
    Cordialement,

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Avec hExecuteRequeteSql, Windev met son nez dans la requête pour la "corriger".
    Peut-être que les "corrections" apportées ne conviennent pas à MySql. Tu peux utiliser hRequeteSansCorrection pour contourner cette "fonctionnalité".

    Tatayo.

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

Discussions similaires

  1. PB Pourcentage Sur requête avec SUM et GROUP BY
    Par laetus dans le forum Langage SQL
    Réponses: 9
    Dernier message: 11/06/2009, 14h18
  2. SUM et GROUP BY
    Par bubu181 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 10/05/2009, 17h12
  3. SUM, CASE, GROUP BY et sous requête
    Par wisrou dans le forum SQL
    Réponses: 2
    Dernier message: 13/02/2008, 13h19
  4. [SQL] Jointure de table avec SUM et GROUP BY
    Par waterjetmedia dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 20/09/2007, 13h17
  5. Requête SQL avec UNION, sum et GROUP BY
    Par Guitariff dans le forum Langage SQL
    Réponses: 6
    Dernier message: 03/12/2006, 13h48

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