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 :

SELECT COUNT DANS UN SELECT


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut SELECT COUNT DANS UN SELECT
    Bonjour à tous,

    je suis débutant en SQL et je ne trouve pas le moyen de faire une requete. J ne sais pas si cela est possible.
    Une sorte de SELECT COUNT dans un SELECT

    Actuellement, j'utilise une requete GROUP BY Date qui me renvoie

    Date1 - Designation1 - Famille - Nombre de famille
    Date1 - Designation1 - Enfant - Nombre d'enfant
    Date2 - Designation2 - Famille - Nombre de famille
    Date2 - Designation2 - Enfant - Nombre d'enfant

    et j'aimerai avoir

    Date1 - Designation1 - Nombre de famille - Nombre d' Enfant
    Date2 - Designation2 - Nombre de famille - Nombre d' Enfant

    Ci-dessous ma 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
    SELECT
    DATE_FORMAT(`activite`.`Date`,'%d-%m-%Y') AS 'Date',
    `activite`.`Designation` AS 'Désignation',
    CASE  LEFT(`activite_participant`.`Participant`,4)
    WHEN 'FAM_ ' THEN 'FAMILLES'
    WHEN 'ENF_ ' THEN 'ENFANTS'
    WHEN 'ASM_ ' THEN 'ASSMATS'
    WHEN 'PAR_ ' THEN 'PARTENAIRES'
    ELSE  LEFT(`activite_participant`.`Participant`,4)
    END  AS Participants,
     Count(`activite_participant`.`ID`) AS 'Nb',
    '' AS 'Commentaire'
    FROM 
    `activite_participant`
     Inner Join `activite` ON `activite_participant`.`ActiviteID` = `activite`.`ID`
    WHERE
    `activite`.`TypeID` = '1'
    GROUP BY LEFT(`activite_participant`.`Participant`,4),`activite`.`Date`
    ORDER BY `activite`.`Date`";
    Merci pour vos pistes !

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 270
    Par défaut
    A mon avis, il faut que tu passes par des jointures.
    Une première jointure joignant le nombre des enfants et une deuxième pour les familles

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Compter revient à additionner des 1.

    Avec 4 CASE, ça doit faire ce que voulez, si j'ai bien compris la requête et le besoin :
    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
    SELECT
    	DATE_FORMAT(a.`Date`,'%d-%m-%Y') AS 'Date',
    	a.Designation AS 'Désignation',
    	SUM(
    		CASE
    			WHEN LEFT(ap.Participant,4) = 'FAM_ ' THEN 1
    			ELSE 0
    		END
    	) AS nb_familles,
    	SUM(
    		CASE
    			WHEN LEFT(ap.Participant,4) = 'ENF_ ' THEN 1
    			ELSE 0
    		END
    	) AS nb_enfants,
    	SUM(
    		CASE
    			WHEN LEFT(ap.Participant,4) = 'ASM_ ' THEN 1
    			ELSE 0
    		END
    	) AS nb_assmats,
    	SUM(
    		CASE
    			WHEN LEFT(ap.Participant,4) = 'PAR_ ' THEN 1
    			ELSE 0
    		END
    	) AS nb_partenaires,
    	SUM(
    		CASE
    			WHEN LEFT(ap.Participant,4) NOT IN ('FAM_ ', 'ENF_ ', 'ASM_ ', 'PAR_ ') THEN 1
    			ELSE 0
    		END
    	) AS nb_autres
    FROM activite_participant ap
    INNER JOIN activite a ON ap.ActiviteID = a.ID
    WHERE a.TypeID = 1
    GROUP BY a.Designation, a.`Date`
    ORDER BY a.Designation, a.`Date`
    Au passage, remarquez qu'avec des alias la requête est moins chiante à écrire et plus facile à lire.
    Et débarrassez-vous de ces saloperies d'apostrophes inversées inutiles quand on nomme correctement les tables et colonnes, ce qui n'est pas le cas ici seulement pour la colonne mal nommée "Date" car c'est un mot réservé du langage SQL.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    case when... n'est intéressant en terme d'écriture que pour plus de 2 cas à traiter, il vaut mieux utiliser if(,,) sinon...
    Code sql : 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
    SELECT
    	DATE_FORMAT(a.`Date`,'%d-%m-%Y') AS 'Date',
    	a.Designation AS 'Désignation',
    	SUM(
    		if(LEFT(ap.Participant,4) = 'FAM_ ',1,0)
    	) AS nb_familles,
    	SUM(
    		if(LEFT(ap.Participant,4) = 'ENF_ ',1,0)
    	) AS nb_enfants,
    	SUM(
    		if(LEFT(ap.Participant,4) = 'ASM_ ',1,0)
    	) AS nb_assmats,
    	SUM(
    		if(LEFT(ap.Participant,4) = 'PAR_ ',1,0)
    	) AS nb_partenaires,
    	SUM(
    		if(LEFT(ap.Participant,4) NOT IN ('FAM_ ', 'ENF_ ', 'ASM_ ', 'PAR_ '),1,0)
    	) AS nb_autres
    FROM activite_participant ap
    INNER JOIN activite a ON ap.ActiviteID = a.ID
    WHERE a.TypeID = 1
    GROUP BY a.Designation, a.`Date`
    ORDER BY a.Designation, a.`Date`
    un peu plus compact et optimisé dans cette situation...
    et pour éviter le recalcul de LEFT(ap.Participant,4)...
    Code sql : 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
    SELECT
    	DATE_FORMAT(a.`Date`,'%d-%m-%Y') AS 'Date',
    	a.Designation AS 'Désignation',
    	SUM(
    		if((@a:=LEFT(ap.Participant,4)) = 'FAM_ ',1,0)
    	) AS nb_familles,
    	SUM(
    		if(@a = 'ENF_ ',1,0)
    	) AS nb_enfants,
    	SUM(
    		if(@a = 'ASM_ ',1,0)
    	) AS nb_assmats,
    	SUM(
    		if(@a = 'PAR_ ',1,0)
    	) AS nb_partenaires,
    	SUM(
    		if(@a NOT IN ('FAM_ ', 'ENF_ ', 'ASM_ ', 'PAR_ '),1,0)
    	) AS nb_autres
    FROM activite_participant ap
    INNER JOIN activite a ON ap.ActiviteID = a.ID
    WHERE a.TypeID = 1
    GROUP BY a.Designation, a.`Date`
    ORDER BY a.Designation, a.`Date`
    ne jamais oublier que l'évaluation dans select va de gauche à droite

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2012
    Messages : 18
    Par défaut
    Merci à tous pour votre aide et vos conseils.

    Cela fonctionne exactement comme je le souhaitai.

    Juste pour info j'avais trouvé un truc qui n'est peut être pas très "CLEAN" qui semble fonctionner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    `activite_participant`.`ActiviteID` as ActID,
    Count(`activite_participant`.`ID`) AS TOTAL,
    (SELECT count(*) FROM `activite_participant` WHERE (`activite_participant`.`Participant` LIKE 'ENF_%') AND (`activite_participant`.`ActiviteID` = ActID)) AS NB1 ,
     
    (SELECT count(*) FROM `activite_participant` WHERE (`activite_participant`.`Participant` LIKE 'ASM_%') AND (`activite_participant`.`ActiviteID` = ActID)) AS NB2 
    FROM
    `activite_participant`
    GROUP BY
    `activite_participant`.`ActiviteID`

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

Discussions similaires

  1. 2 colonnes "count" dans un select ?
    Par Chabouille dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/11/2009, 16h28
  2. comment utiliser SELECT COUNT dans ma fonction
    Par z_ahlam dans le forum Langage
    Réponses: 2
    Dernier message: 14/10/2009, 16h30
  3. select COUNT dans java
    Par 080983 dans le forum JDBC
    Réponses: 6
    Dernier message: 19/07/2007, 17h47
  4. Plusieurs Count dans mon select
    Par thomfort dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/03/2007, 17h39
  5. 3 count dans un select possible?
    Par cari dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/02/2007, 14h56

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