Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours 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 11/02/2012, 14h40   #1
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 28
Points : 16
Points : 16
Par défaut Requête deux résultats sur une même ligne

bonjour à tous,

je souhaiterai savoir si la requête suivante est faisable (j'ai tourné le problème dans tous les sens... impossible de trouver la solution).

j'ai une table pour laquelle je souhaiterai connaître le nombre de clients qui ont un n° de téléphone de renseigné ou non par société.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
table_test :
societe |	client	|	telephone
---------------------------------
1	|	a	|	123456
1	|	b	|	NULL
2	|	c	|	
2	|	d	|	132648
2	|	e	|	968514
3	|	f	|	NULL
3	|	g	|	
3	|	h	|	6543211
 
résultat de la requête :
societe | avec tel      |	sans tel
--------------------------------
1	|	1	|	1
2	|	2	|	1
3	|	1	|	2
j'ai essayé en effectuant une jointure comme ceci :

select t1.societe, count(t1.telephone) as avec_tel, count(t2.telephone) as sans_tel from table_test t1 left join table_test t2 on (t1.societe = t2.societe)
group by t1.societe where (t1.telephone <> "") and (t1.telephone is not null) and ((t2.telephone = "") or (t2.telephone is null))

bien entendu ça ne fonctionne pas.

quelqu'un a une idée ? merci pour votre aide.



del.
delaio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2012, 15h18   #2
Membre actif
 
Inscription : janvier 2012
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 117
Points : 173
Points : 173
Problème très similaire à celui évoqué par Florian L...

2 manières de faire:

Code :
1
2
3
4
5
6
SELECT societe,
       sum(case when telephone IS NOT NULL AND telephone<>'' then 1 else 0 end) AS AVEC_TEL,
       sum(case when telephone IS NULL OR telephone='' then 1 else 0 end) AS SANS_TEL
 FROM table_test
 GROUP BY societe
 ORDER BY societe
et:

Code :
1
2
3
4
5
6
SELECT societe,
       (SELECT count(*) FROM table_test t WHERE t.societe=table_test.societe AND NOT(t.telephone='' OR telephone IS NULL)) AS AVEC_TEL,
       (SELECT count(*) FROM table_test t WHERE t.societe=table_test.societe AND (t.telephone='' OR telephone IS NULL)) AS SANS_TEL
FROM table_test
GROUP BY societe
ORDER BY societe;
KookieMonster est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/02/2012, 15h41   #3
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 669
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 669
Points : 2 680
Points : 2 680
Bonjour,

Ca serai cool d'arrêter de proposer la 2eme syntaxe qui est vraiment pourri en terme de perf et ne manquera pas de faire effondrer le serveur s'il y a un tout petit peu de volumétrie.

C'est une requête scalaire qui va :
- pour chaque ligne retournée par la requête principale faire une requête d'agrégation.

Dans le cas présent :
=> 1 scannage de table_test pour faire l'agrégat
=> Et ensuite le SGBD va refaire 2 scannages de table_test par ligne résultat




La 1ere syntaxe ne va faire qu'un seul scannage de table pour servir la requête.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 11/02/2012, 15h59   #4
Membre actif
 
Inscription : janvier 2012
Messages : 117
Détails du profil
Informations forums :
Inscription : janvier 2012
Messages : 117
Points : 173
Points : 173
Je partage absolument ton avis Punkoff sur l'énorme lenteur de la seconde requête. Mais pour une personne qui inverse group by et where, voir 2 solutions à un problème (une bonne et une qui l'est bien moins) et comprendre la différence me semble intéressant.
KookieMonster est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2012, 12h10   #5
Futur Membre du Club
 
Inscription : décembre 2003
Messages : 28
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 28
Points : 16
Points : 16
merci beaucoup à vous deux pour votre coup de main. et merci à punkoff pour son commentaire très instructif sur la deuxième proposition.

bonne journée.

del.

ps : et désolé pour l'inversion du group by et du where (j'étais pourtant bien réveillé ce jour là !?!!)

delaio 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 22h33.


 
 
 
 
Partenaires

Hébergement Web