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 :

Count et group by


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Par défaut Count et group by
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Nom_client           banque             montant 
    Jean                 Credit agricole      265,00 
    pascal              Societe general     378,00
    mickael             Societe general     780,00
    harry                Bnp paribas          187,00
    michael             Bnp paribas          256,00
    Svp je veux avoir le resultat suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Nom                  Banque               Total par banque  
    Jean                 Credit agricole           265,00 
    Plusieurs           Societe general        1158,00
    Plusieurs           Bnp paribas               443,00
    si un seul client dans une banque (count(*)=1)alors afficher son nom+banque+montant
    si plusieur personnes dans une banque(count(*)>1 ) alors au lieu d'ecrire tout les nom je veux le resultat dans un seul enregistrement
    qui contient plusieurs+banque+sum(Total par banque).
    Svp est ce que vous pouvez m'aider a ecrire cette requette ?
    j'ai essaye d'ecrire une requette mais ca ne marche pas et je ne sais pas comment faire pour avoir le sum dans la requette
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select case when COUNT(*)=1 then Nom_client when COUNT(*)>1 then 'Plusieurs' END 
    from client_banque
    group by banque
    Merci d'avance.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 22 010
    Billets dans le blog
    6
    Par défaut
    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
    WITH 
    T0 AS
    (
    SELECT banque, SUM(montant) AS montant, COUNT(DISTINCT Nom_client) AS NB_CLI
    FROM   client_banque
    GROUP  BY banque
    )
    SELECT DISTINCT CASE NB_CLI 
                       WHEN 1 
    				      THEN Nom_client 
    				   ELSE 'Plusieurs' 
    				END AS Nom_client, 
    	   CB.banque, T0.montant
    FROM   client_banque AS CB
           LEFT OUTER JOIN T0  
    	        ON CB.banque = T0.banque
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    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
    Citation Envoyé par messi1987 Voir le message
    j'ai essaye d'ecrire une requette mais ca ne marche pas et je ne sais pas comment faire pour avoir le sum dans la requette
    Elle ne fonctionne pas car vous devez utiliser une fonction d'agrégation pour l'appel à la colonne Nom_Client puisque celle ci ne fait pas partie des colonnes de regroupement. Dans votre cas, vous pouvez utiliser simplement MAX ou MIN, puisque par définition, toutes auront la même valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select 
        case when COUNT(*)=1 then MAX(Nom_client) when COUNT(*)>1 then 'Plusieurs' END as Nom
        , banque
        , SUM(montant) AS TotalBanque
    from client_banque
    group by banque

  4. #4
    Membre confirmé
    Inscrit en
    Novembre 2010
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Novembre 2010
    Messages : 80
    Par défaut
    Merci SQLpro et aieeeuuuuu , votre solution marche tres bien.
    mais j'ai trois questions concernant la clause case
    est-ce que les colonnes qui apparaissent dans la partie WHEN ex (id_client=1 and banque='Societe generale') doivent etre present dans la clause group by s'il y a apres une fonction comme sum ou avg?
    si on ajoute dans la partie WHEN une fonction d'aggregation count sum ex (count(id_client)=1 and sum(montant)) ,est ce que id_client et montant doivent etre present dans la clause group by?
    est ce que les colonnes qui apparaissent dans la partie THEN doivent etre present dans la clause group by s'il y a apres une fonction comme sum ou avg? ?

    Merci d'avance

  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
    Pour répondre à ces trois questions de façon générale, il suffit de comprendre la logique du GROUP BY. Celui-ci regroupe les lignes ayant les mêmes valeurs pour la ou les colonnes spécifiées.

    Pour chaque ligne résultant de ce regroupement, on dispose donc d'un jeu de valeurs potentiellement différentes pour toutes les colonnes ne faisant pas partie de la clause de regroupement. Dés lors, il faut spécifier quelle valeur doit être retenue pour la ligne en question. Cela se fait avec une fonction d'agrégation (SUM, MAX, MIN, AVG,...).

    lorsque vous utilisez un (CASE... WHEN ... THEN...), le problème reste le même : vous avez potentiellement plusieurs valeurs distinctes, et à la fin, il ne doit en rester qu'une ! Vous devez donc appliquer une fonction d'agrégation pour cela. Elle peut s'appliquer à différends niveaux dans votre CASE en fonction du besoin :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MAX( CASE WHEN UneColonne = UneAutreColonne THEN EncoreUneAutreColonne END)
    Dans ce cas, l'expression CASE WHEN est évaluée pour chaque ligne du groupe, est c'est la valeur maximum du résultat qui est conservée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN MAX(UneColonne) = AVG(UneAutreColonne) THEN AVG(EncoreUneAutreColonne) END
    Dans ce cas, les fonctions d'agrégation sont appliquées, puis le CASE est évalué.

    Des colonnes faisant partie de la clause de regroupement peuvent également être utilisées dans les CASE WHEN. Il n'est alors bien évidemment pas nécessaire (bien que possible, mais sans intérêt) de l'inclure dans une fonction d'agrégation.

+ 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