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

Langage SQL Discussion :

Requête deux résultats sur une même ligne


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    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 : 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
    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.

  2. #2
    Membre actif
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Points : 226
    Points
    226
    Par défaut
    Problème très similaire à celui évoqué par Florian L...

    2 manières de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    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.

  4. #4
    Membre actif
    Inscrit en
    Janvier 2012
    Messages
    145
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 145
    Points : 226
    Points
    226
    Par défaut
    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.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    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à !?!!)


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

Discussions similaires

  1. Mettre deux boutons sur une même ligne
    Par fidbell84 dans le forum Mise en page CSS
    Réponses: 3
    Dernier message: 05/05/2015, 10h38
  2. Deux images sur une même ligne
    Par ahmedpa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 13/07/2012, 11h25
  3. deux figures sur une même ligne (pas de sous-figure)
    Par Invité dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 5
    Dernier message: 28/07/2011, 20h25
  4. Requête pour résultats sur une seule ligne
    Par jobine2011 dans le forum Développement
    Réponses: 3
    Dernier message: 05/01/2011, 18h06
  5. Résultat de 2 requêtes sur une même ligne
    Par cgone dans le forum SQL
    Réponses: 1
    Dernier message: 20/04/2007, 18h17

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