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 :

Requ^te avec 2 COUNT ?


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 60
    Points : 38
    Points
    38
    Par défaut [Résolu] Requ^te avec 2 COUNT ?
    Bonjour,

    L'idée c'est d'avoir un résultat comme ça :

    Mois/Année | Nb création par user de type X | Nb creation par user de type Y
    01/2005 | 2 | 6
    02/2005 | 5 | 10
    03/2005 | 2 | 3

    J'ai :
    1 table HISTORY avec la DATEOPERATION, l'id de l'élément, ID user, type EVENEMENT
    1 table ELEMENT avec un ID
    1 table USER avec un ID

    J'arrive à le faire avec Nb création par X et par Y dans deux requêtes mais pas dans une seule !

    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
    TO_CHAR(HISTORY.DATEOPERATION,'MM')||'-'||TO_CHAR(HISTORY.DATEOPERATION,'YYYY') as "Mois/Année",
    	  COUNT(ELEMENT.ID) as "Nb element created"
     
    FROM 
          HISTORY,
          ELEMENT
    WHERE
             HISTORY.USERID = USER.ID
      AND HISTORY.EVENT like 'New%'
      AND HISTORY.USERID not like 'X'
     
    GROUP BY TO_CHAR(HISTORY.DATEOPERATION,'MM')||'-'||TO_CHAR(HISTORY.DATEOPERATION,'YYYY')
    ORDER BY 1
    Si vous avez une idée pour avoir un résultat comme demandé, merci d'avance.
    Bonne journée

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Si tu n'es pas sur d'avoir tous les mois de l'année pour le type X ou Y, tu peux essayer cela.
    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
    SELECT MOIS_AN, SUM(NB_X) as NB_X, SUM(NB_Y) as NB_Y
    from (
    	SELECT 
    	TO_CHAR(HISTORY.DATEOPERATION,'MM-YYYY') as MOIS_AN, 
    	     COUNT(ELEMENT.ID) as NB_X , 0 AS NB_Y
     
    	FROM 
    	      HISTORY, 
    	      ELEMENT 
    	WHERE 
    	 HISTORY.EVENT like 'New%' 
    	  AND HISTORY.USERID not like 'X' 
     
    	GROUP BY TO_CHAR(HISTORY.DATEOPERATION,'MM-YYYY')
    	union
    	SELECT 
    	TO_CHAR(HISTORY.DATEOPERATION,'MM-YYYY') as MOIS_AN, 
    	     0 as NB_X , COUNT(ELEMENT.ID) AS NB_Y
    	FROM 
    	      HISTORY, 
    	      ELEMENT 
    	WHERE 
    	 HISTORY.EVENT like 'New%' 
    	  AND HISTORY.USERID not like 'Y' 
    	GROUP BY TO_CHAR(HISTORY.DATEOPERATION,'MM-YYYY')
    ) AS T
    group by MOIS_AN
    ORDER BY MOIS_AN
    Sinon, ou si tu as une table calendrier on doit pouvoir simplifier un peu.

    Tu dois pouvoir faire l'union sans agrégation puis faire qu'une seule agrégation, également. A toi de voir
    J'ai simplifer tes to_date, et supprimé la HISTORY.USERID = USER.ID car il n'y avait pas de table user dans ta requete
    Cordialement
    Soazig

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut Re: Requ^te avec 2 COUNT ?
    Tu es sous ORACLE donc tu peux utiliser DECODE avec une version suffisante (je ne sais plus laquelle) tu peux utiliser CASE WHEN
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT
    TO_CHAR(HISTORY.DATEOPERATION,'MM')||'-'||TO_CHAR(HISTORY.DATEOPERATION,'YYYY') as "Mois/Année",
    	  SUM(DECODE(HISTORY.USERID, 'X', 1, 0)) as "Nb element created by X"
    	  SUM(DECODE(HISTORY.USERID, 'Y', 1, 0)) as "Nb element created by Y"
    FROM 
          HISTORY,
          ELEMENT
    WHERE
          HISTORY.USERID = USER.ID
      AND HISTORY.EVENT like 'New%'
      AND HISTORY.USERID  IN ('X', 'Y')
    GROUP BY TO_CHAR(HISTORY.DATEOPERATION,'MM')||'-'||TO_CHAR(HISTORY.DATEOPERATION,'YYYY')
    ORDER BY 1
    Je ne suis pas certain d'avoir compris le sens de HISTORY.USERID not like 'X'
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    merci je vais essayer vos propositions, je vous tiens au courant.
    (j'ai des tables avec des noms un peu plus bizarre et de sjointures supplémentaires à faire donc A+)

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    Bon et bien j'ai un souci.
    Voici avec mes bon noms de tables ce que cela donne (j'avais changé les noms de tables pour que ce soit plus clair)

    Cette requête donne quelque chose mais pas les bons chiffres :

    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
    SELECT 
    	   TO_CHAR(ICONTACTMANAGEMENT.DATEOPERATION,'MM-YYY'),
    	   SUM(TABLE_NOTSOB.NB_X) as "Nb SC create by User",
    	   SUM(TABLE_SOB.NB_Y) as "Nb SC create by SOB"
    FROM 
    ICONTACTMANAGEMENT,
    ( 
    	SELECT
    		  TO_CHAR(ICM1.DATEOPERATION,'MM-YYY') as  "MonthYear",
    		  COUNT(SC1.ID) as NB_X,
    		  0 as NB_Y
     
    	FROM 
    		 ICONTACTMANAGEMENT ICM1,
    		 SUPPLIERCONTACT SC1
    	WHERE
    		     ICM1.CONTACTID = SC1.ID
    		 AND ICM1.EVENT like 'New%'
    		 AND ICM1.USEROPERATION not like 'SOB:%'
     
    	GROUP BY TO_CHAR(ICM1.DATEOPERATION,'MM-YYY')
    ) TABLE_NOTSOB,
     
    (
    	SELECT
    		  TO_CHAR(ICM2.DATEOPERATION,'MM-YYY') as  "MonthYear",
    		  0 as NB_X,
    		  COUNT(SC2.ID) as NB_Y
     
    	FROM 
    		 ICONTACTMANAGEMENT ICM2,
    		 SUPPLIERCONTACT SC2
    	WHERE
    		     ICM2.CONTACTID = SC2.ID
    		 AND ICM2.EVENT like 'New%'
    		 AND ICM2.USEROPERATION like 'SOB:%'
     
    	GROUP BY TO_CHAR(ICM2.DATEOPERATION,'MM-YYY')
    ) TABLE_SOB
    GROUP BY TO_CHAR(ICONTACTMANAGEMENT.DATEOPERATION,'MM-YYY')
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Month-Year|Nb SC create by User|Nb SC create by SOB
    02-005|1658712|90768
    03-005|7878882|431148
    04-005|20686314|1131996
    05-005|6879576|376464
    06-005|5112096|279744
    07-005|503052|27528
    Alors que pris séparément j'ai :

    TABLE_NOTSOB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Month-Year|Nb SCcreated by User
    02-2005|228
    03-2005|785
    04-2005|1624
    05-2005|506
    06-2005|247
    07-2005|9
    ET
    TABLE_SOB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Month-Year|Nb SCcreated by SOB
    06-2005|56
    07-2005|6

    Merci d'avance

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je ne sais pas si tu as vu mais dans ma requete initiale il y avait un "union" entre les 2 select.
    Là tu les as transformer en sous requete sans critère de jointure, ce qui fait un très joli produit cartésien.
    Si je reprends ton code en remettant le UNION qui n'aurait jamais dû disparaitre.
    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
    SELECT Mois_Annee as  "MonthYear"
          SUM(T.NB_X) as "Nb SC create by User",
          SUM(T.NB_Y) as "Nb SC create by SOB"
    FROM
    (
       SELECT
            TO_CHAR(ICM1.DATEOPERATION,'MM-YYY')  as  Mois_Annee,
            COUNT(SC1.ID) as NB_X,
            0 as NB_Y   
       FROM
           ICONTACTMANAGEMENT ICM1,
           SUPPLIERCONTACT SC1
       WHERE
               ICM1.CONTACTID = SC1.ID
           AND ICM1.EVENT like 'New%'
           AND ICM1.USEROPERATION not like 'SOB:%'      
       GROUP BY TO_CHAR(ICM1.DATEOPERATION,'MM-YYY')
    UNION --Ne pas supprimer c'est important.
       SELECT
            TO_CHAR(ICM2.DATEOPERATION,'MM-YYY')  as Mois_Annee,
            0 as NB_X,
            COUNT(SC2.ID) as NB_Y
       FROM
           ICONTACTMANAGEMENT ICM2,
           SUPPLIERCONTACT SC2
       WHERE
               ICM2.CONTACTID = SC2.ID
           AND ICM2.EVENT like 'New%'
           AND ICM2.USEROPERATION like 'SOB:%'      
       GROUP BY TO_CHAR(ICM2.DATEOPERATION,'MM-YYY')
    ) AS  T
    GROUP BY Mois_Annee
    Es-tu sûr d'avoir compris la requete avant de l'éxecuter? Vu la transformation que tu lui as fait subir, je n'en suis pas sûre.

    L'idée de l'union, c'est que tu calcules ton nombre pour un critère , puis pour l'autre tu mets les deux à la queue leu leu . Tu obtiens quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Month-Year|Nb_X|NB_Y
    02-2005   |228 |0
    03-2005   |785 |0
    04-2005   |1624|0
    05-2005   |506 |0
    06-2005   |247 |0
    07-2005   |9   |0
    06-2005   |0   |56
    07-2005   |0   |6
    Et quand tu sommes les résultats et que tu regroupes sur le mois, cela te donne pour le mois de juin en NB_X
    247+0=247 et pour NB_Y=0+6=6

    J'ai à nouveau supprimé la table ICONTACTMANAGEMENT du premier from puisqu'elle ne servait qu'à faire un produit cartésien de plus, le mois tu l'avais déjà dans les sous requetes.


    Si tu as besoins de te raffraichir le sql tu peux faire un tour http://sqlpro.developpez.com/cours/sqlaz/ensembles/ Il doit y avoir les notions que j'ai utilisé dans cette requête.
    J'espère que c'est plus clair, et que tu comprends ce que je te fais faire, car si ce n'est pas le cas, ne le fais pas.
    Sérieusement la requête que tu nous as fourni a du tourner un bon moment, pour faire autant de produit cartésiens, et tu risques de mettre ton SGBD à genoux. Je sais qu'Oracle c'est costaud, mais il y a des limites.

    Cordialement
    Soazig

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    OK c'est exactement ce que je veux ....

    J'avais bien vue le UNION, malheureusement, après des essaies nons concluants, je suis repartie dans d'autres trucs, j'ai mélé diverses requêtes -> bref cété pas une réussite (dûre semaine aussi).

    Lundi je retenterai avec le UNION mais je suis pratiquement sûre de n'avoir jamais eut ce résultat (sinon je l'aurais gardé ) !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Month-Year|Nb_X|NB_Y 
    02-2005   |228 |0 
    03-2005   |785 |0 
    04-2005   |1624|0 
    05-2005   |506 |0 
    06-2005   |247 |0 
    07-2005   |9   |0 
    06-2005   |0   |56 
    07-2005   |0   |6
    Ok mes cours sur certaines parties sont à rafraichir
    Y a pas eut de souci de perf sur ma première requête, tout simplement parce qu'il n'y a encore pas grand chose dans mes tables. D'habitude lorsque ça dure plus de 2 secondes je sens bien que j'ai fais une boulette

    Merci
    A+

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Coucou, petite précision :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Month-Year|Nb_X|NB_Y
    02-2005   |228 |0
    03-2005   |785 |0
    04-2005   |1624|0
    05-2005   |506 |0
    06-2005   |247 |0
    07-2005   |9   |0
    06-2005   |0   |56
    07-2005   |0   |6
    est le résultat intermédiaire de la sous 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
    SELECT
            TO_CHAR(ICM1.DATEOPERATION,'MM-YYY')  as  Mois_Annee,
            COUNT(SC1.ID) as NB_X,
            0 as NB_Y   
       FROM
           ICONTACTMANAGEMENT ICM1,
           SUPPLIERCONTACT SC1
       WHERE
               ICM1.CONTACTID = SC1.ID
           AND ICM1.EVENT like 'New%'
           AND ICM1.USEROPERATION not like 'SOB:%'     
       GROUP BY TO_CHAR(ICM1.DATEOPERATION,'MM-YYY')
    UNION --Ne pas supprimer c'est important.
       SELECT
            TO_CHAR(ICM2.DATEOPERATION,'MM-YYY')  as Mois_Annee,
            0 as NB_X,
            COUNT(SC2.ID) as NB_Y
       FROM
           ICONTACTMANAGEMENT ICM2,
           SUPPLIERCONTACT SC2
       WHERE
               ICM2.CONTACTID = SC2.ID
           AND ICM2.EVENT like 'New%'
           AND ICM2.USEROPERATION like 'SOB:%'     
       GROUP BY TO_CHAR(ICM2.DATEOPERATION,'MM-YYY')
    Et non le résultat total de la requête finale.
    Le résultat de la requête finale devrait plutôt être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Month-Year|Nb_X|NB_Y
    02-2005   |228 |0
    03-2005   |785 |0
    04-2005   |1624|0
    05-2005   |506 |0
    06-2005   |247 |56
    07-2005   |9   |6
    Sauf si j'ai fait une boulette, cela m'arrive aussi.
    A+
    Soazig

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    60
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2003
    Messages : 60
    Points : 38
    Points
    38
    Par défaut
    en effet j'avais mal regardé (parceque celui-là je l'avais déjà trouvé tout seule en fait mais je n'arrivais pas à faire en sorte de n'avoir qu'une fois le mois avec les autres résultats sur la même ligne), bref c'est bien le dernier résultat qu'il me faut.
    Ensuite j'aurai d'autres colonnes avec d'autres critères à rajouter sur le même principes.
    J'méclate avec des report en ce moment
    Oulala mes TD de B.D. sont super loin maintenant ....
    Merci encore
    @+

    OK c'ets bon ça marche

    Pour info pas de AS à la suite du

    (
    Select
    ...
    ...
    ) Nom_Table

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

Discussions similaires

  1. [SQL] Problème avec SELECT COUNT(*)
    Par jpascal dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/11/2006, 12h37
  2. Réponses: 3
    Dernier message: 03/10/2006, 23h20
  3. [MySQL] Problème requete avec un count
    Par kornmuse90 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 02/03/2006, 08h56
  4. [SQL]Requete avec 2 count(*) sur la même table
    Par Sonny dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/11/2005, 16h41
  5. Probleme d'execution d'une requete avec un Count
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 23/06/2004, 10h33

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