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 :

Faire un SUM de plusieurs COUNT


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Faire un SUM de plusieurs COUNT
    Bonjour,

    Je viens vers vous car j'ai une chose qui m'échappe.
    Je souhaite faire une somme des résultats de 2 requêtes, j'ai donc fait le code comme ci dessous :

    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
    SELECT SUM(tot) 
    FROM (
    	(
    	SELECT COUNT( * ) AS 'tot'
    	FROM ref_MAXROY
    	WHERE 1 =1
    	AND  `multiplexage` =  'SX'
    	AND  `debit` >=20
    	AND  `debit` <=(20 * 1.25)
    	AND  `pmax` >=20
    	)
    	UNION (
    	SELECT COUNT( * ) AS 'tot'
    	FROM ref_mROY
    	WHERE 1 =1
    	AND  `multiplexage` =  'SX'
    	AND  `debit` >=14
    	AND  `debit` <=(14 * 1.25)
    	AND  `pmax` >=20
    	)
    ) AS t
    Chaque requête a 1 résultat, ce qui fait : 1+1 = ... je vous laisse calculer . Or je ne trouve pas 2 mais 1.

    Le plus étrange c'est que si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT SUM(tot) 
    FROM (
    	SELECT COUNT( * ) AS 'tot'
    	FROM ref_MAXROY
    	WHERE 1 =1
    	AND  `multiplexage` =  'SX'
    	AND  `debit` >=20
    	AND  `debit` <=(20 * 1.25)
    	AND  `pmax` >=20
    )
    AS t
    Il me trouve 1 et si je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT SUM(tot) 
    FROM (
    	SELECT COUNT( * ) AS 'tot'
    	FROM ref_mROY
    	WHERE 1 =1
    	AND  `multiplexage` =  'SX'
    	AND  `debit` >=14
    	AND  `debit` <=(14 * 1.25)
    	AND  `pmax` >=20
    )
    AS t
    Il me trouve 1 aussi.

    Alors pourquoi il me trouve pas 2 au total ?
    Ai-je fais une faute quelque part ?

    /!\ Chose très bizarre aussi: Si je retire une condition (peu importe laquel) dans chaque requête, ça fonctionne !!!!
    Y a de quoi se casser les dents

    Svp de l'aide merci

  2. #2
    Membre habitué
    Femme Profil pro
    Database
    Inscrit en
    Juin 2010
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Database

    Informations forums :
    Inscription : Juin 2010
    Messages : 125
    Points : 135
    Points
    135
    Par défaut
    Bonjour,

    Après une rapide révision de l'union, je crois que le problème vient de là...


    Explication pouvant être pausible mais aussi contesté, si quelqu'un à une meilleure explication, je suis preneuse...

    Apparement , l'option d'unification par défaut retourne les enregistrement Distinct, soit dans votre cas les 2 sous-requêtes rapportant le même résultat, cela ne doit retourné qu'une seule ligne...

    Bref, peut-être que si dans la requete vous faisiez une vonne vieille addition des 2 select cela fonctionnerait-il?

    Soit :

    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
    SELECT (SELECT COUNT( * ) 
               FROM ref_MAXROY  
                 WHERE 1 =1      
                 AND  `multiplexage` =  'SX'
                 AND  `debit` >=20
                 AND  `debit` <=(20 * 1.25)
                 AND  `pmax` >=20) 
    +
            ( SELECT COUNT( * ) 
               FROM ref_mROY
                WHERE 1 =1
                AND  `multiplexage` =  'SX'
                AND  `debit` >=14
                AND  `debit` <=(14 * 1.25)
                AND  `pmax` >=20)
    ) AS t
    Merci de me faire savoir si ça fonctionne!!!!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    Merci de ta réponse, mais cela ne fonctionne pas, il n'accepte pas le + (Je crois que le + n'est pas accepté dans mysql, dites moi si je me trompe).
    Concernant mes 2 résultats, ils sont différents en tout point, donc même avec un DISTINCT il ne devrait pas me réduite mes résultats en 1.

    Autre piste dans ma réflexion:
    Si le résultat est différent de 1+1 = 2, ca fonctionne.
    ex: Si ma première requête a 1 résultat et ma seconde en a 2, ça fonctionne : il me retourne 3 (1+2 = 3 c'est bien ça ? )
    La franchement je sèche.

    Merci de votre aide

  4. #4
    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
    Effectivement, UNION opère un DISTINCT, comme expliqué dans la doc MySQL :
    Si vous n'utilisez pas le mot clef ALL pour l'UNION, toutes les lignes retournées seront uniques, comme si vous aviez fait un DISTINCT pour l'ensemble du résultat. Si vous spécifiez ALL, vous aurez alors tout les résultats retournés par toutes les commandes SELECT.
    Comme le résultat des deux comptages est identique, il va faire l'UNION en une seule ligne. Si les deux comptages donnent des résultats différents, ça fera deux lignes.

    Il faut donc utiliser UNION ALL.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Super merci à vous 2 !
    Le UNION ALL fonctionne.
    Ca m'enlève une bonne épine du pied.

    Longue vie à la communauté developpez.com , toujours une réponse à mes problèmes.

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

Discussions similaires

  1. Faire plusieurs Count selon critéres sur la même colonne
    Par Florian.L dans le forum Langage SQL
    Réponses: 5
    Dernier message: 30/05/2012, 18h14
  2. Faire plusieurs count dans une seule requete
    Par Gregory.M dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/07/2010, 12h35
  3. Un SUM de plusieurs COUNT pour plusieurs users
    Par Kendrak dans le forum Requêtes
    Réponses: 0
    Dernier message: 23/07/2009, 15h13
  4. faire plusieur count dans une même requète
    Par bossLINDROS dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 28/04/2008, 10h04
  5. Comment faire un SUM de 2 COUNT
    Par webwolf dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/12/2007, 13h30

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