Partage
  • Partager sur Facebook
  • Partager sur Twitter

Un GROUP BY dans un COUNT

Sujet résolu
    19 juillet 2010 à 17:17:29

    ... suite de ce topic :
    http://www.siteduzero.com/forum-83-532 [...] x-tables.html

    Bonjour,
    voici mon soucis, il y a un champ 'service' qui a des données identiques !!!

    voici la requete, et je voudrais donc regrouper les 'service' identique

    SELECT t2.id2,service,
    (SELECT COUNT(categorie)
    FROM table1
    WHERE categorie='a' AND code1=code2) AS cat
    FROM table2 t2
    WHERE t2.groupe='1'
    ORDER BY t2.id2 ASC
    


    j'ai bien tenté ceci :

    SELECT t2.id2,service,
    (SELECT COUNT(categorie)
    FROM table1
    WHERE categorie='a' AND code1=code2) AS cat
    FROM table2 t2
    WHERE t2.groupe='1'
    GROUP BY service
    ORDER BY t2.id2 ASC
    


    cela à bien regroupé les 'service'
    mais sans comptabiliser l'ensemble des 'cat' ayant le meme nom de service'

    je voudrais savoir le nombre de categorie 'a' dans chaque 'groupe'
    mais je voudrais afficher par 'service' qui sont des sous-groupe de 'categorie'
    le soucis c'est qu'il y a des 'service' portant le meme nom et ayant un code1 qui n'égale pas au code2 !

    en gros, voilà ce que j'obtiens
    et je voudrais donc regrouper les 'service'
    tout en additionnant les totaux

    id2 	service 	       cat
    18 	direction       	0
    19 	secrétariat     	15
    20 	technicien 	        46
    21 	technicien 	        5
    22 	unité           	19
    23 	unité           	1
    24 	Bureau Central    	1
    25 	Bureau Central  	2
    26 	encadrement      	2
    27 	encadrement     	4
    



    cela ne doit pas etre grand chose mais je but sur ce petit truc
    merci de votre aide
    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2010 à 19:56:11

      Je suis assez étonné par le résultat de ta requête car la valeur pour cat devrait être toujours la même étant donné qu'elle ne dépend pas de la requête parente. (Elle n'est pas corréllée)

      J'aurais aussi voulu savoir ce que représente code1=code2? Est-ce qu'il s'agirait de la dépendance que je pense ne pas avoir vu? :D

      Est ce que ce sont des champs de la table1? Est-ce que code1 vient de table1 et code2 de table2?

      Une fois que tu m'auras eclairé là dessus je pourrais surement t'aider d'avantage.
      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2010 à 21:52:57

        Je vais essayer de donner plus d'informations
        pour t'éclairer, si tu veux autres choses... ;)

        J'ai donc deux tables

        table1               table2
        
        id1 code1 categorie    id2 code2 groupe
         1   001      a         1   001    1
         2   002      b         2   002    1
         3   003      c         3   003    1
         4   004      d         4   004    2
         5   005      e         5   005    2
         6   006      b         6   006    2
         7   007      a         7   007    3
         8   008      a         8   008    3
         9   009      c         9   009    3
        


        les CREATE TABLE

        CREATE TABLE IF NOT EXISTS `table1` (
          `id1` int(11) NOT NULL auto_increment,
          `nom` text NOT NULL,
          `prenom` text NOT NULL,
          `categorie` text NOT NULL,
          `code1` text NOT NULL,
          PRIMARY KEY  (`id1`)
        ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
        


        CREATE TABLE IF NOT EXISTS `table2` (
        `id2` int(11) NOT NULL auto_increment,
        `groupe` text NOT NULL,
        `service` text NOT NULL,
        `code2` text NOT NULL,
        PRIMARY KEY (`id2`)
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;
        


        et les INSERT INTO
        INSERT INTO `table1` (`id1`,`nom`, `prenom`, `categorie`, `code1`) VALUES
        (1, 'durant', 'andre', 'a', '001',),
        (2, 'dupont', 'Jean', 'b', '002'),
        (3, 'martin', 'Elodie', 'c', '003'),
        (4, 'blanc', 'Dominique', 'd', '004'),
        (5, 'rouge', 'Monique', 'e', '005'),
        (6, 'vert', 'Francois', 'b', '006'),
        (7, 'bleu', 'Fabien', 'a',  '007'),
        (8, 'noir', 'Jean', 'a', '008'),
        (9, 'blanc', 'Marie', 'c', '009'),
        


        INSERT INTO `table2` (`id2`, `groupe`, `service`, `code2`) VALUES
        (1, '1', 'direction', '001'),
        (2, '1', 'direction', '002'),
        (3, '1', 'secrétariat', '003'),
        (4, '2', 'technicien', '004'),
        (5, '2', 'unité', '005'),
        (6, '2', 'technicien', '006'),
        (7, '3', 'secrétariat', '007'),
        (8, '3', 'encadrement', '008'),
        (9, '3', 'direction', '009'),
        


        je voudrais arriver à un résultat similaire à celui là
        tout en observant que la 1ere ligne indique bien un service dont
        personnes n'est affecté !
        et le but ici est de regrouper les services identiques
        en additionnant la valeur du même service

        id2 	service 	       cat
        18 	direction       	0
        19 	secrétariat     	15
        20 	technicien 	        46
        21 	technicien 	        5
        22 	unité           	19
        23 	unité           	1
        24 	Bureau Central    	1
        25 	Bureau Central  	2
        26 	encadrement      	2
        27 	encadrement     	4
        



        merci pour ton aide :)
        • Partager sur Facebook
        • Partager sur Twitter
          20 juillet 2010 à 22:56:42

          Ok le problème est alors le fait que tu veuilles récupérer id2

          En effet tu ne peux pas regrouper par nom de service tout en récupérant id2, qui lui est différent même si c'est le même nom de service...

          Donc si tu veux regrouper par nom de service faudra alors pas récupérer id2, en effet ca n'aurait pas beaucoup de sens. Quel id2 serait affiché en face du nom de service lors du regroupement?

          Je ne sais pas si je suis clair en fait :euh:

          Si jamais tu abandonnes id2 tu peut faire la requête suivante alors:

          SELECT service, COUNT(*) as cat
          FROM table2
          GROUP BY service
          



          Par contre il y aun truc que je suis pas sur: est-ce que tu veux compter les lignes ou additionner les codes... Si c'est une addition tu remplaces la fonction d'agrégation et c'est joué.
          • Partager sur Facebook
          • Partager sur Twitter
            21 juillet 2010 à 9:56:16

            alors effectivement ça fonctionne bien ;)
            mais comme précisé pour le résultat ci-dessus
            la 1ere ligne indique bien
            un service dont personnes n'est affecté !
            et je voudrais donc que ce service soit tout de même
            affiché avec le zéro en face

            et oui je veux compter le nombre de lignes ;)

            voici la requête avec le bon regroupement mais
            sans le détail des 'service' qui sont à zéro

            SELECT service, COUNT(*) as cat
            FROM table2, table1
            WHERE categorie IN ('a' , 'b' , 'c') AND code1=code2 AND groupe='1'
            GROUP BY service
            ORDER BY id2 ASC
            
            • Partager sur Facebook
            • Partager sur Twitter
              21 juillet 2010 à 23:05:39

              Avec les données que tu me montre et la requête que tu fais, c'est normal que tu n'ais pas de service avec 0, tu prends le groupe = 1 et dans le groupe = 1 il y a des enregistrements pour chaque service.

              En fait je vois pas trop pourquoi tu veux que les catégories a, b et c et que le groupe 1

              Par contre ta condition de jointure elle est nécessaire pour avoir un count correct ce que j'avais pas mis dans ma requête :)
              • Partager sur Facebook
              • Partager sur Twitter
                21 juillet 2010 à 23:27:48

                l'exemple que je donne avec a b c et 1 2 3 ne reflete pas tout à fait ma base de donnée de travail ;)

                et sinon tu vois une solution pour pouvoir afficher les services à 0 ?
                • Partager sur Facebook
                • Partager sur Twitter
                  23 juillet 2010 à 21:03:56

                  Est ce que quand t'éxécutes cette requête, tu obtiens une autre valeur que 0 pour le count ou est ce que tu ne vois tout simplement pas le service qui devrait être à 0?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 juillet 2010 à 21:23:45

                    salut, merci de te pencher sur mon cas :)

                    je pense etre sur le bon chemin avec ceci
                    il faut encore que je teste, mais ca a l'air pas mal

                    select T2.service, COUNT(T1.categorie) AS cat
                    from table2 T2
                    left join table1 T1 on T1.code1 = T2.code2
                    WHERE (categorie IN ('a','b','c') OR categorie IS NULL)
                      AND t2.groupe='1'
                    group by T2.service
                    ORDER BY t2.id2 ASC
                    


                    &

                    select T2.service, COUNT(T1.categorie) AS cat
                    from table2 T2
                    left join table1 T1 on T1.code1 = T2.code2 AND categorie IN ('a','b','c')
                    WHERE t2.groupe='1'
                    group by T2.service
                    ORDER BY t2.id2 ASC
                    
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 juillet 2010 à 22:17:39

                      A choisir je prèfère la première. Les bonnes pratiques disent de mettre les conditions de jointure après le ON et les filtres dans le Where.


                      Sinon concernant la requête en elle même elle me semble cohérente en effet!
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Un GROUP BY dans un COUNT

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown