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

Développement SQL Server Discussion :

Moyenne de count et group by [2017]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut Moyenne de count et group by
    Bonjour à tous,
    Je suis nouveau sur la partie SQL du forum.

    J'ai trois tables :
    Adherents : Id, Qualite, Nom, Prenom, Complement, Batiment, Adresse, Code Postal, Ville, Pays, DateNaissance, DateFede, DateClub, Categorie, DateInscription, TelDom, TelPor, Type
    Seances : Id, Nom, DateDebut, DateFin
    Participants : IdAdherent, IdSeance, Encadrant
    Je cherche à des fins de statistique de faire les moyennes de nombre de participants par séances.
    Le nom des séances est toujours identique : Séance du et le nom du jour.

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select Seances.nom,
        Count(Participants.IdAdherent) as Nbr_Participant
    From Seances inner join Participants on Seances.Id = Participants.IdSeance inner join Adherents on Participants.IdAdherent = Adherents.Id
    Group by Seances.nom
    J'obtiens :

    nom Nbr_Participant
    Séance du mardi 7
    Séance du mercredi 5
    Séance du samedi 4
    Séance du vendredi 8

    Cependant si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select Seances.nom,
        AVG(Count(Participants.IdAdherent)) as Moy_Participant
    From Seances inner join Participants on Seances.Id = Participants.IdSeance inner join Adherents on Participants.IdAdherent = Adherents.Id
    Group by Seances.nom
    J'obtiens l'erreur : "Msg 130, Niveau 15, État 1, Ligne 2
    Cannot perform an aggregate function on an expression containing an aggregate or a subquery."


    Merci par avance.
    Bonne journée.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 440
    Par défaut
    Bonjour,
    Tu peux utiliser une sous-requête ou une CTE.
    Mais dans ton exemple tu auras de toute façon exactement le même résultat, vu que tu utilises le même regroupement.

    Tatayo.

  3. #3
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Merci pour ta réponse.
    J'ai déjà essayé ne sous requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Select Seances.nom, AVG(M.Nbr_Participant)
    From(
        Select         
            Count(Participants.IdAdherent) as Nbr_Participant,
            Seances.id
        From Seances Inner Join Participants on Seances.Id = Participants.IdSeance 
        Group by Seances.Id
         ) M 
         Group By Seances.Nom
    ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select AVG(M.Nbr_Participant)
    From(
        Select         
            Count(Participants.IdAdherent) as Nbr_Participant,
            Seances.id
        From Seances Inner Join Participants on Seances.Id = Participants.IdSeance 
        Group by Seances.Id
         ) M
    Mais je ne parviens pas au résultat souhaité.
    Merci.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 440
    Par défaut
    Je pense que tu n'es pas loin avec la première requête.
    Je décomposerai le problème ainsi:
    1. Décompte du nombre de participant pas séance:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select s.id,s.nom,count(*) as nb
    from seance s
    inner join participant p on p.id_seance = s.id
    group par s.id,s.nom
    2: calcul de la moyenne, avec une sous-requête:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select m.nom,avg(nb)
    from (
    select s.id,s.nom,count(*) as nb
    from seance s
    inner join participant p on p.id_seance = s.id
    group par s.id,s.nom
    ) as m
    group by m.nom

    Tu peux aussi utiliser une CTE pour plus de clareté, mais je n'ai pas la syntaxe en tête.

    Tatayo.

  5. #5
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour,

    C'est plutôt la deuxiéme requete qui me semble correcte. il faut juste transtyper le résultat du COUNT en decimal sinon la moyenne sera un entier également :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Select AVG(CAST(M.Nbr_Participant AS DECIMAL(8,4)))
    From(
        Select         
            Count(Participants.IdAdherent) as Nbr_Participant,
            Seances.id
        From Seances Inner Join Participants on Seances.Id = Participants.IdSeance 
        Group by Seances.Id
         ) M

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 440
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 440
    Par défaut
    aieeeuuuuu: je ne pense pas, car il veut la moyenne par nom (libellé) de séance, et non la moyenne globale.
    Visiblement plusieurs séances peuvent avoir le même nom.
    Donc pour il faut en premier compter le nombre de participant par séance (en gardant le nom), puis faire la moyenne par nom.
    Par contre +1 pour le transtypage (pas bien réveillé ce matin ).

    Ou alors je n'ai pas bien compris la demande.
    Pour éviter toute confusion, il serai bien d'avoir un jeu de test et le résultat attendu.

    Tatayo.

  7. #7
    Membre chevronné Avatar de r.morel
    Homme Profil pro
    Dessinateur CAO
    Inscrit en
    Août 2014
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Dessinateur CAO
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2014
    Messages : 339
    Par défaut
    Salut à tous les deux,
    Merci pour vos réponses.

    J'ai en fait utilisé un mélange de vos méthodes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Select M.Nom, M.Categorie, M.Qualite, AVG(CAST(M.Nbr_Participant AS DECIMAL(8,4))) as Moyenne
    From(
        Select Count(Participants.IdAdherent) as Nbr_Participant, Seances.Id, Seances.Nom, Adherents.Categorie, Adherents.Qualite
        From Seances Inner Join Participants on Seances.Id = Participants.IdSeance Inner Join Adherents on Participants.IdAdherent = Adherents.Id
        Group by Seances.Id, Seances.Nom, Adherents.Categorie, Adherents.Qualite
    ) M
    Group By M.Nom, M.Categorie, M.Qualite
    Order By M.Nom
    Bonne journée

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 09/10/2007, 16h36
  2. [requete] Probleme de COUNT() et GROUP BY
    Par cadoudal56 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/12/2006, 19h23
  3. problème count et group by
    Par zulkifli dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/11/2006, 04h53
  4. Requête récalcitrante avec un tri par COUNT sans GROUP BY
    Par Ancalagon77 dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/10/2006, 14h27
  5. Pb de COUNT et GROUP BY simple mais sans requête imbriquées
    Par vanquish dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/10/2004, 09h45

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