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 :

Problème avec UNION et Group by


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 9
    Points
    9
    Par défaut Problème avec UNION et Group by
    Bonjour,

    J'ai deux requetes :
    la première
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT idIn, SUM(isIn) as total
    FROM logs
    WHERE ok = '1'
    AND arch = '0'
    AND isIn = '1'
    AND TO_DAYS( NOW( ) ) - TO_DAYS( dateAjout ) <=2
    GROUP BY idIn
    la seconde :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT idOut, SUM(isOut) AS total 
    FROM logs 
    WHERE arch='0' 
    AND isOut='1' 
    AND TO_DAYS(NOW()) - TO_DAYS(dateAjout) <= 2
    GROUP BY idOut
    J'essaye d'avoir une seule requete, aprés de multiple essai la requete qui s'en rapproche le plus est :


    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
     
    SELECT idIn, SUM(isIn) as totalin
    FROM annufr_logs
    WHERE ok = '1'
    AND arch = '0'
    AND isIn = '1'
    AND TO_DAYS( NOW( ) ) - TO_DAYS( dateAjout ) <=2
    GROUP BY idIn
    UNION ALL
    SELECT idOut, SUM(isOut) AS totalout 
    FROM annufr_logs 
    WHERE arch='0' 
    AND isOut='1'
    AND TO_DAYS(NOW()) - TO_DAYS(dateAjout) <= 2
    GROUP BY idOut
    Mais j'ai comme résultat :

    idIn totalin
    1 50
    2 100
    3 150
    4 200
    1 20
    2 40
    3 60
    4 80

    alors que je recherche ce type de résultat

    idIn idOut totalin totalout
    1 1 50 20
    2 2 100 40
    3 3 150 60
    4 4 200 80



    Merci pour votre aide

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    je rate une subtilité ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT idIn, idOut, SUM(isIn) AS totalin, SUM(isOut) AS totalout
     FROM annufr_logs
     WHERE arch='0'
     AND isOut='1'
     AND TO_DAYS(NOW()) - TO_DAYS(dateAjout) <= 2
     GROUP BY  idIn, idOut
    PS : merci de penser aux balises CODE
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci Antoun pour ta réponse.

    Le problème viens du fait que la condition WHERE est différente entre les deux requetes.

    Je viens de tenter cette solution , mais elle me fait planté SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    SELECT A1.idIn,SUM(A1.isIn) as totalin,A2.idOut,SUM(A2.isOut) AS totalout
    FROM annufr_logs A1,annufr_logs A2
    WHERE A1.ok = '1'
    AND A1.arch = '0'
    AND A1.isIn = '1'
    AND A2.arch='0' 
    AND A2.isOut='1' 
    AND TO_DAYS( NOW( ) ) - TO_DAYS(A1.dateAjout ) <=2
    GROUP BY A2.idOut,A1.idIn

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par dujardin
    Le problème viens du fait que la condition WHERE est différente entre les deux requetes.

    J'aurais dû essuyer mes lunettes

    Si je ne me trompe pas dans la factorisation de tes conditions, cela fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT idIn, idOut, SUM(isIn) AS totalin, SUM(isOut) AS totalout
    FROM annufr_logs
    WHERE arch = '0' 
      AND ( ok = '1' AND isIn = '1' OR isOut='1')
      AND TO_DAYS(NOW()) - TO_DAYS(dateAjout) <= 2
    GROUP BY  idIn, idOut
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 9
    Points
    9
    Par défaut
    Merci j'avais pas pensé cette solution.
    La condition WHERE fonctionne bien, il y a juste un probleme avec le GROUP BY
    Lorsque j'ai les deux

    j'ai ce type de résultat:

    idIn IdOUt totalin totalout
    0 0
    0 1
    0 2
    1 0
    1 1
    1 2
    2 0
    2 1
    2 2
    .....

    lorsque j'ai un seul GROUP BY idIn
    j'ai ce type de résultat
    idIn IdOUt totalin totalout
    0 2 10 10
    1 1 20 20
    2 3 30 30
    3 0 40 40

    et le résultat dans totalin est juste
    Si je met juste GRoup by IdOUt le résultat dans totalout est juste

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

Discussions similaires

  1. [aide]probléme avec l'instruction group by
    Par diden138 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/05/2007, 07h09
  2. problème avec UNION SQL
    Par greg1517 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 06/05/2007, 19h46
  3. [Cognos 6][Impromptu] Problème avec les champs groupés
    Par nicoduhavre dans le forum Cognos
    Réponses: 4
    Dernier message: 23/03/2007, 15h27
  4. [XML][XSLT] Débutant {Probléme avec For-each-group}
    Par Silvia12 dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 29/01/2006, 21h38
  5. Problème avec UNION et WHERE
    Par portu dans le forum Langage SQL
    Réponses: 13
    Dernier message: 20/04/2005, 11h29

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