Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/06/2011, 12h10   #1
Invité régulier
 
Inscription : juillet 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 4
Points : 6
Points : 6
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 :
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
steerayInFrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 12h27   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Vous n'étiez pas très loin, il faut mettre les count à l'extérieur des conditions :
Code :
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
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 14h08   #3
Invité régulier
 
Inscription : juillet 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 4
Points : 6
Points : 6
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 :
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 :
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 ?
steerayInFrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 14h18   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
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 !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 14h20   #5
Invité régulier
 
Inscription : juillet 2009
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2009
Messages : 4
Points : 6
Points : 6
OK
Merci pour tes réponses Waldar et bonne journée
steerayInFrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h10.


 
 
 
 
Partenaires

Hébergement Web