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

Requêtes MySQL Discussion :

Group by incomplet


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut Group by incomplet
    Bonjour à tous,

    Ci-joint un morceau de la table sur laquelle je travaille.
    La requête que j'exécute:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      SELECT SUM(Montant) AS Montant, Date, Mode, LibModeReg, Divers
        FROM encaiss, modereg
       WHERE NumUser = '3518'
         AND encaiss.Mode = modereg.IDModeReg
          OR NumUser = '3667'
         AND encaiss.Mode = modereg.IDModeReg
    GROUP BY Divers DESC;
    Problème:
    La requête me regroupe le total des "REDUC 30%" en une seule fois alors qu'il me le faudrait en plusieurs fois (séparé par la date en fait)

    Quelqu'un a une idée ?
    Merci d'avance.
    Images attachées Images attachées  
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,

    votre requête initiale comporte plusieurs problème.

    Déjà au niveau des jointures il y a une redondance inutile d'une condition.

    Ensuite j'ai un gros doute sur la syntaxe de votre "OR", vous avez du oublier des parenthèse.

    donc =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
        FROM encaiss a
        inner join modereg b on a.mode = b.IDModeReg
       WHERE NumUser in ('3518', '3667')
    Maintenant passons au problème.
    Déjà votre syntaxe pour le group by est mauvaise (merci MySql ...)

    Toute colonne présente dans le select non encadrée par une fonction d'agrégation (min, max, etc) doit être présente dans la clause group by.

    Sinon je n'arrive pas à comprendre le résultat que vous souhaitez, pourriez vous le donner ?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci de votre aide et réponse.

    Le résultat que je souhaite obtenir au final est le total des montants qui correspondent à une même date ou encadrement d'une date.

    Exemple avec ma table:

    Total de 15.25 et 19.48, total de 31.37 et 49.7, ou encore total de 27.2 et 29.1

    Le group by sur le champ divers était pratique car uniquement deux lignes pouvaient porter la même valeur dans le champ divers.
    Mais maintenant avec la valeur "Reduc30%" mon group by divers ne fonctionne plus correctement et je ne peux pas l'appliquer sur le champ date car les valeurs ne sont pas identiques.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    que veut dire :
    total des montants qui correspondent à une même date ou encadrement d'une date
    Pour avoir un résultat sur une date un simple group by sur la date suffira, mais cette notion d'encadrement de date est flou.

    edit: sinon pour le reste de l'explication, désolé mais après 3 relectures je n'ai pas compris.

  5. #5
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Effectivement c'est pas très claire.

    En plus personnellement je comprends pas grand chose à la structure des tables utilisées (juste avec l'imprime écran)

    Peut tu faire une pseudo explication des deux tables, avec leur type de données ?
    Ca rendra plus facile la rédaction de la requête...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par mactwist69 Voir le message
    Effectivement c'est pas très claire.

    En plus personnellement je comprends pas grand chose à la structure des tables utilisées (juste avec l'imprime écran)

    Peut tu faire une pseudo explication des deux tables, avec leur type de données ?
    Ca rendra plus facile la rédaction de la requête...
    J'ai joint un fichier sql pour la structure de mes tables je pensais que c'était suffisant, que faut il d'autre ?

    Citation Envoyé par punkoff Voir le message
    bonjour,

    que veut dire :

    Pour avoir un résultat sur une date un simple group by sur la date suffira, mais cette notion d'encadrement de date est flou.

    edit: sinon pour le reste de l'explication, désolé mais après 3 relectures je n'ai pas compris.
    Il me semblait aussi que j'étais pas super claire donc pour faire plus simple j'ai fait un screen pour chaque résultat que j'obtiens en fonction du group by (divers = premier screen, date = second screen).
    Et un autre screen d'un tableau fait sous excel du résultat que je souhaite obtenir.
    Images attachées Images attachées    

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bon,

    alors quelle logique appliquez-vous pour savoir si on doit regrouper deux ou plus lignes qui ont une colonne divers égale à "REDUC 30%" ?

    Ensuite, par rapport à votre jeux de donnée la ligne correspondant à la date "1319440320" et ayant un divers égale à "REDUC 30%" à disparu de votre résultat souhaité.
    Pourquoi ?

    edit: et sinon cette colonne "date", comment l'interprétez-vous en une date ? c'est une date unix ?

  8. #8
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Autant pour moi... pas vu la PJ.

    Bon, on se penchera sur l'histoire de plage de date après.

    Est ce que la requête suivante te retourne quelque chose qui te plait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(e.MONTANT), e.Date, e.Mode, e.Divers
    FROM  encaiss e
    GROUP BY e.Date, e.Divers

    J'ai pas compris l’intérêt de faire une jointure sur modreg... a moins que tu préfères afficher le libellé plutôt que l'ID, auquel cas la requête sera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(e.MONTANT), e.Date, m.LibModeReg, e.Divers
    FROM  encaiss e
    INNER JOIN modereg m ON m.IDModeReg=e.Mode
    GROUP BY e.Date, e.Divers

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par punkoff Voir le message
    bon,

    alors quelle logique appliquez-vous pour savoir si on doit regrouper deux ou plus lignes qui ont une colonne divers égale à "REDUC 30%" ?

    Ensuite, par rapport à votre jeux de donnée la ligne correspondant à la date "1319440320" et ayant un divers égale à "REDUC 30%" à disparu de votre résultat souhaité.
    Pourquoi ?

    edit: et sinon cette colonne "date", comment l'interprétez-vous en une date ? c'est une date unix ?
    On se base sur la date pour faire les regroupement et il n'y a que pour "REDUC 30%" que cela pose un problème vue qu'il y a un décalage de quelques secondes.

    Elle disparait car elle est regroupée avec "Cor:CHS>AUS REDUC 30%" vue que la date est identique aux quelques secondes de décalage.

    La colonne date est convertie avec une fonction php lors de son affichage pour l'utilisateur. (Peut être pas la réponse espérée?)

    Citation Envoyé par mactwist69 Voir le message
    Autant pour moi... pas vu la PJ.

    Bon, on se penchera sur l'histoire de plage de date après.

    Est ce que la requête suivante te retourne quelque chose qui te plait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(e.MONTANT), e.Date, e.Mode, e.Divers
    FROM  encaiss e
    GROUP BY e.Date, e.Divers

    J'ai pas compris l’intérêt de faire une jointure sur modreg... a moins que tu préfères afficher le libellé plutôt que l'ID, auquel cas la requête sera:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT SUM(e.MONTANT), e.Date, m.LibModeReg, e.Divers
    FROM  encaiss e
    INNER JOIN modereg m ON m.IDModeReg=e.Mode
    GROUP BY e.Date, e.Divers
    La requête donne le même résultat que sur le screen n°2 hélas..
    Mon boss ma dit qu'il se servait de la même requête à un autre endroit d'où la jointure...

  10. #10
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Elle disparait car elle est regroupée avec "Cor:CHS>AUS REDUC 30%" vue que la date est identique aux quelques secondes de décalage.
    Avec de telle règle de gestions ... c'est pas cadré votre besoin ici.
    Vosu souhaitez obtenir un résultat qui n'a pas de cohérence avec le reste.

    Bref la direction que je prendrai c'est de caster vos timestamp text en date et de faire un group by dessus.

    Par contre pour l'histoire du divers, ca risque dêtre farfelu au niveau du rendu de MySql vu vos cas. Il va falloir jouer avec des min/max sur cette colonne.

    Je ne comprend pas pourquoi vous n'avez pas utilisé un type timestamp dans votre modélisation en fait.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Le group by sur la colonne Divers était juste une astuce de mon tuteur avant l'apparition des valeurs "REDUC 30%" donc on est pas obligé de travailler sur cette colonne en fait.

    On utilise pas un type timestamp car on récupère les tables d'une base de donnée access enfin d'après ce qu'on ma dit..

  12. #12
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    oki que donne ceci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select  from_unixtime(date,'%Y %M %D') as date_op, sum(montant) as sum_montant, max(divers) as divers, max(mode) as mode
    from encaiss
    group by from_unixtime(date,'%Y %M %D')
    (il faudra peut-être reformater votre date pour la faire correspondre à un unix timestamp... je vous laisse chercher.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par punkoff Voir le message
    oki que donne ceci ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select  from_unixtime(date,'%Y %M %D') as date_op, sum(montant) as sum_montant, max(divers) as divers, max(mode) as mode
    from encaiss
    group by from_unixtime(date,'%Y %M %D')
    (il faudra peut-être reformater votre date pour la faire correspondre à un unix timestamp... je vous laisse chercher.
    Un grand merci à vous !
    C'est exactement ce que je voulais j'ai juste fais une petite modification pour avoir l'affichage des dates correctements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  from_unixtime(date,'%d %m %Y') AS date_op, sum(montant) AS sum_montant, max(divers) AS divers, max(mode) AS mode
    FROM encaiss
    GROUP BY from_unixtime(date,'%Y %m %d') DESC;

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

Discussions similaires

  1. Group By incomplet
    Par Daniel MOREAU dans le forum Langage SQL
    Réponses: 3
    Dernier message: 24/10/2007, 10h15
  2. [CR8] Groupes nommés par ordre spécifié
    Par PschittN dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 17/05/2004, 23h46
  3. [RaveReport] - Bloquer groupe sur une page
    Par muaddib dans le forum Rave
    Réponses: 3
    Dernier message: 25/02/2003, 16h21
  4. gestion des groupes
    Par muaddib dans le forum QuickReport
    Réponses: 3
    Dernier message: 31/12/2002, 11h01

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