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

MySQL Discussion :

pb plusieurs count(*) dans une meme requete


Sujet :

MySQL

  1. #1
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut pb plusieurs count(*) dans une meme requete
    Bonjour,
    Dans une seule requete SQL je voudrais remonter quelque chose comme

    categ totalZ totalY TotalZY
    a n1 n2 n3
    b m1 m2 m3

    totalZ et totalY sont des count(*) normalement.
    Pour total de ZY je fais un sum sur les alias et ça me donne le n3 o m3

    En SQL server je sais traiter là je sèche.
    Tout ce que j'ai testé ne fonctionne pas :
    - créer une table temporaire puis l'y mettre mes différents résultats, pis l'appeler à la fin comme dernière requete (echec, erreurs dans tous les sens).
    - faire un (SELECT CASE WHEN truc THEN COUNT('Z') ELSE 0 END) AS totalZ (quand je fais un truc du genre sous SQL server j'ai ce que je veux..) là ça me fais pas ce que je veux.
    - faire une sous requete (select count(*) as nb from tab where dpt = 75 group by categ)

    Dans mon résultat j'attends toujours 2 lignes (a et b) que le résultat de count(*) soit >= 0. Cas inverse afficher 0

    Comment faire en mySQL, pour combiner en une seule requete plusieurs count sur un meme regroupement (categ) ?
    Je voudrais régler la question par MySQL pas par PHP.

    Est-ce que vous avez une idée svp ?

    merci d'avance

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Peux-tu donner une requête que tu ferais sous SQL Server, qui ne marche pas sous MySQL, et le message d'erreur ou l'anomalie ?

  3. #3
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut
    Hello
    Merci de m'avoir répondu. Je vois que tu es expert, ça tombe bien, ton avis m'interesse.

    Voici un exemple que je compose en mySQL.
    Et c'est parce que sous SQL server j'ai l'habitude de faire des choses comme ça que j'y pense..


    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
    SELECT DISTINCT `STTCAT_MTLib` AS rep_categ
    ,(CASE WHEN `TPIT_NatId` = 31 THEN COUNT(`TPIT_NatId`) ELSE 0 END) AS rep_nb_hg
    ,(CASE WHEN `TPIT_LocId` = 3 THEN COUNT(`TPIT_NatId`) ELSE 0 END) AS rep_nb_sic
    ,(CASE WHEN `TPIT_NatId` IN (9,12,32,46,65,81,82) THEN COUNT(`TPIT_NatId`) ELSE 0 END) AS rep_nb_ad
    FROM `t_pitemp` 
    LEFT JOIN `st_categ` ON `STTCAT_Id` = MID(`TPIT_ProfilId`,2,1) AND `STTCAT_Used` = 1
    LEFT JOIN `st_sgeoloc` ON `STSGL_Id` = `TPIT_LocId` AND `STSGL_Used` = 1
    LEFT JOIN `st_ca` ON `STCA_Id` = `STSGL_CaId` AND `STCA_Used` = 1
    WHERE `TPIT_StateId` IN (2,3,4) 
    AND `TPIT_Used` = 1
    GROUP BY `STTCAT_MTLib`
    UNION ALL
    SELECT 'tot'--dernière ligne de total
    ,(CASE WHEN MID(`TPIT_ProfilId`,1,1) = 1 THEN COUNT(`TPIT_ProfilId`) ELSE 0 END) AS rep_nb_ind
    ,(CASE WHEN MID(`TPIT_ProfilId`,1,1) = 2 THEN COUNT(`TPIT_ProfilId`) ELSE 0 END) AS rep_nb_col
    ,SUM(0) + SUM(1) as rep_sum
    FROM `t_pitemp` 
    LEFT JOIN `st_categ` ON `STTCAT_Id` = MID(`TPIT_ProfilId`,2,1) AND `STTCAT_Used` = 1
    WHERE `TPIT_StateId` IN (2,3,4) 
    AND `TPIT_Used` = 1
    Pour cette requette j'obtiens 0 partout. il me fait le total à 81.
    Je mets sum(0) et (1) parce qu'il me prends pas la somme avec alias.
    Dans cas là je n'ai pas d'erreur de syntaxe.
    Mais j'en ai eu plusieurs (ex : pas possible de faire un count sur 4 lignes via une sous requete qui regroupe en 4 catégorie(col1), nb_lines(col2),sum_lines(col3)...

    J'espère que je suis clair
    Merci de ton aide

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Citation Envoyé par helrick Voir le message
    J'espère que je suis clair
    Pas du tout.

    SUM(0) ne peut que te donner 0. SUM(1) est équivalent à un COUNT(*). Je ne vois pas trop en quoi tu en espères quoi que ce soit...

    On va prendre les choses dans l'ordre... est-ce que la première partie de ta requête passe sans erreur et te donne les bons résultats ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT`STTCAT_MTLib` AS rep_categ
    ,(CASE WHEN `TPIT_NatId` = 31 THEN COUNT(`TPIT_NatId`) ELSE 0 END) AS rep_nb_hg
    ,(CASE WHEN `TPIT_LocId` = 3 THEN COUNT(`TPIT_NatId`) ELSE 0 END) AS rep_nb_sic
    ,(CASE WHEN `TPIT_NatId` IN (9,12,32,46,65,81,82) THEN COUNT(`TPIT_NatId`) ELSE 0 END) AS rep_nb_ad
    FROM `t_pitemp` 
    LEFT JOIN `st_categ` ON `STTCAT_Id` = MID(`TPIT_ProfilId`,2,1) AND `STTCAT_Used` = 1
    LEFT JOIN `st_sgeoloc` ON `STSGL_Id` = `TPIT_LocId` AND `STSGL_Used` = 1
    LEFT JOIN `st_ca` ON `STCA_Id` = `STSGL_CaId` AND `STCA_Used` = 1
    WHERE `TPIT_StateId` IN (2,3,4) 
    AND `TPIT_Used` = 1
    GROUP BY `STTCAT_MTLib`
    Au passage, j'ai enlevé le DISTINCT qui ne sert à rien quand tu fais déjà un GROUP BY.

  5. #5
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut
    Ta correction de requete ne compte rien. ça me renvoie 0 à toutes les lignes.

    Je change et simplifie l'intitulé de la question.

    Dans une même colonne d'un SELECT de 2 lignes par ex, quand on veut faire sur chacune des 2 lignes 1 COUNT(*) on fait comment ?

    exemple : Répartition entre homme et femme de ce que vous voulez :
    Popuulation - Nb
    Homme - 3000
    Femme - 9000

    Les 3000 : correspondent au résultat d'un COUNT sur certains critères
    Les 9000 correspondent au résultant d'un autre COUNT sur d'autres critères.
    Mais dans la même colonne je veux pouvoir les dissocier.
    Est-ce possible ?
    Y a t-il une autre façon de faire que je ne vois pas ?

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Citation Envoyé par helrick Voir le message
    Ta correction de requete ne compte rien. ça me renvoie 0 à toutes les lignes.
    En fait tu as mal placé tes COUNT... SQL Server te l'aurait signalé comme erreur, mais MySQL est plus tolérant...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT`STTCAT_MTLib` AS rep_categ
    , COUNT(CASE WHEN `TPIT_NatId` = 31 THEN TPIT_NatId ELSE NULL END) AS rep_nb_hg
    , COUNT(CASE WHEN `TPIT_LocId` = 3 THEN TPIT_NatId ELSE NULL END) AS rep_nb_sic
    , COUNT(CASE WHEN `TPIT_NatId` IN (9,12,32,46,65,81,82) THEN COUNT`TPIT_NatId` ELSE NULL END) AS rep_nb_ad
    FROM `t_pitemp` 
    LEFT JOIN `st_categ` ON `STTCAT_Id` = MID(`TPIT_ProfilId`,2,1) AND `STTCAT_Used` = 1
    LEFT JOIN `st_sgeoloc` ON `STSGL_Id` = `TPIT_LocId` AND `STSGL_Used` = 1
    LEFT JOIN `st_ca` ON `STCA_Id` = `STSGL_CaId` AND `STCA_Used` = 1
    WHERE `TPIT_StateId` IN (2,3,4) 
    AND `TPIT_Used` = 1
    GROUP BY `STTCAT_MTLib`

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 741
    Points
    11 741
    Par défaut
    Pour répondre à ta question Hommes/Femmes...

    Si j'ai une Table Population (IDpersonne, Groupe, Sexe, etc.), je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Groupe, 
      COUNT(CASE WHEN Sexe = 'M' THEN Sexe ELSE NULL) AS NbH,
      COUNT(CASE WHEN Sexe = 'F'  THEN Sexe ELSE NULL) AS NbF
    FROM Population
    GROUP BY Groupe
    Variante que je trouve plus naturelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT Groupe, 
      SUM(CASE WHEN Sexe = 'M' THEN 1 ELSE 0) AS NbH,
      SUM(CASE WHEN Sexe = 'F' THEN 1 ELSE 0) AS NbF
    FROM Population
    GROUP BY Groupe

  8. #8
    Membre averti
    Homme Profil pro
    Chef de projets Décisionnel
    Inscrit en
    Juillet 2007
    Messages
    263
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projets Décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2007
    Messages : 263
    Points : 320
    Points
    320
    Par défaut
    Tu as certainement raison.
    Je n'aurais pas eu l'idée d'écrire comme ça.
    A mon sens je fais "Cas ou truc = trop Alors compte le nombre de lignes sinon ne fait rien"
    Là ça me renvoie une erreur 1064 qui ne veut rien dire.
    Mais tant pis je me suis arrangé autrement. 4 jours de perdus.

    Pour ton second exemple je prends note, J te remercie

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

Discussions similaires

  1. [MySQL] Effectuer plusieurs COUNT dans une requete mysql
    Par AurelienNF dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/12/2010, 09h01
  2. Plusieurs Count() dans une seule requete
    Par mazdahmen dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/10/2010, 19h34
  3. Faire plusieurs count dans une seule requete
    Par Gregory.M dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/07/2010, 12h35
  4. Plusieurs count dans une requete !
    Par cmoi70 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/02/2010, 17h15
  5. PLusieurs COUNT dans une requete?
    Par haludo dans le forum Access
    Réponses: 3
    Dernier message: 04/10/2006, 10h38

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