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 :

Deux count sur même champ avec conditions différentes


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Chef de projet
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut Deux count sur même champ avec conditions différentes
    Bonjour à tous,

    Je souhaite obtenir le résultat suivant :

    Nom | Nb Contrat 1 | Nb Contrat 2
    Nom1 | 3 | 5
    Nom2 | 5 | 10

    J'ai 2 tables :
    - Table de personnnes avec les champs [IdPers, Nom]
    - Table des Contrats avec les champs [IdContrat, Ref, Type, IdPers]

    Ma requête est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
    	Pers.Nom,
    	case when Cntr.Type =0 
    	then count(Cntr.Ref) end as NB_Contrat_1, 
    	case when Cntr.Type =1 
    	then count(Cntr.Ref) end as NB_Contrat_2 
    FROM
        Personne Pers INNER JOIN Contrat Cntr ON
            Pers.IdPers = Cntr.IdPers
    WHERE Cntr.Ref Like 'P%'
    group by Pers.Nom, Cntr.Type
    Le problème est que j'obtiens cela :
    Nom | Nb Contrat 1 | Nb Contrat 2
    Nom1 | 3 | NULL
    Nom1 | NULL | 5
    Nom2 | 5 | NULL
    Nom2 | NULL | 10

    Merci d'avance pour votre aide

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Vous n'étiez pas très loin, il faut mettre les count à l'extérieur des conditions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      SELECT Pers.Nom
           , count(case Cntr.Type when 0 then Cntr.Ref end) AS NB_Contrat_1
           , count(case Cntr.Type when 1 then Cntr.Ref end) AS NB_Contrat_2
        FROM dbo.Personne as Pers
             INNER JOIN dbo.Contrat as Cntr
               ON Cntr.IdPers = Pers.IdPers
       WHERE Cntr.Ref LIKE 'P%'
    GROUP BY Pers.Nom
    ORDER BY Pers.Nom ASC

  3. #3
    Futur Membre du Club
    Profil pro
    Chef de projet
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    Merci Waldar pour ta réponse.
    En effet j'étais pas loin, et c'est souvent en ayant la solution sous les yeux qu'on ne la voit pas

    J'ai entretemps testé une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT 
    	Pers.Nom,
    	sum(case when Cntr.Type =0 
    	then 1 else 0 end) as NB_Contrat_1, 
    	sum(case when Cntr.Type =1 
    	then 1 else 0 end) as NB_Contrat_2 
    FROM
        Personne Pers INNER JOIN Contrat Cntr ON
            Pers.IdPers = Cntr.IdPers
    WHERE Cntr.Ref Like 'P%'
    group by Pers.Nom, Cntr.Type
    Peux-tu me dire quelle est la version la plus adapté, ta version ou la mienne ?

    et j'ai aussi ajouté un calcul de % :
    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
    SELECT 
    	Pers.Nom,
    	sum(case when Cntr.Type =0 
    	then 1 else 0 end) as NB_Contrat_1, 
    	sum(case when Cntr.Type =0 
    	then 1 else 0 end)*100.00/count(Cntr.ref) as PCT_Contrat_1, 
    	sum(case when Cntr.Type =1 
    	then 1 else 0 end) as NB_Contrat_2,
    	sum(case when Cntr.Type =1 
    	then 1 else 0 end)*100.00/count(Cntr.ref) as PCT_Contrat_2
    FROM
        Personne Pers INNER JOIN Contrat Cntr ON
            Pers.IdPers = Cntr.IdPers
    WHERE Cntr.Ref Like 'P%'
    group by Pers.Nom, Cntr.Type
    Qu'en penses-tu ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Attention au GROUP BY, ça change vraiment la signification de la requête.
    Ceci mis à part, c'est bien la même chose.

    J'ai une petite préférence pour le count, car le but de la requête est de compter des éléments : je trouve donc l'utilisation de count plus naturelle que le sum.

    Mais la requête avec le sum ne me choque pas outre mesure !

  5. #5
    Futur Membre du Club
    Profil pro
    Chef de projet
    Inscrit en
    Juillet 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Chef de projet

    Informations forums :
    Inscription : Juillet 2009
    Messages : 4
    Points : 7
    Points
    7
    Par défaut
    OK
    Merci pour tes réponses Waldar et bonne journée

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

Discussions similaires

  1. Select avec 2 conditions sur même champs
    Par Floyus dans le forum Requêtes
    Réponses: 3
    Dernier message: 05/06/2013, 09h55
  2. [AC-2003] Sélectionner deux fois le même champ avec deux conditions différentes
    Par juju1988 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/10/2010, 09h23
  3. [AC-2003] Acess Req Ajout sur 3 champs avec conditions
    Par cbienmoi dans le forum IHM
    Réponses: 1
    Dernier message: 01/09/2009, 20h29
  4. plusieurs COUNT sur une seule table avec conditions différentes
    Par dingoth dans le forum Administration
    Réponses: 9
    Dernier message: 20/12/2006, 10h13
  5. Réponses: 12
    Dernier message: 12/06/2006, 14h29

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