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 avec un taux à calculer


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut Requête avec un taux à calculer
    Bonjour tout le monde,

    Je dois faire une requête pour laquelle il me manque quelques (pas mal si je suis honnête) notions..

    Voici les 3 tables utilisée :

    Agent
    idAgent

    Client
    idClient
    idAgent

    RendezVous
    idRDV
    idClient
    idAgent

    Je veux lister TOUS les Agents (facile)
    je veux le nombre de RendezVous pour chaque Agent pour le mois courant.
    J'ai réussi en faisant une sous requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT agent.*;
    	(SELECT count(*) FROM rendezvous rdv WHERE rdv.dateDebutPrevue > "2017-06-01 00:00:00" AND  rdv.dateDebutPrevue < "2017-06-31 00:00:00" AND rdv.idAgent = ag.idAgent) as nb 
    FROM agent ag
    Je n'arrive pas à faire ça via une jointure, je pense que c'est plus propre (à tort ou à raison je ne sais pas), mais je n'arrive pas à utiliser le COUNT avec le JOIN.

    Là où ça se complique vraiment et où je bloque : je dois avoir, pour chaque Agent , le pourcentage de Client associés pour lesquels il y a eu au moins 2 RendezVous

    J'ai tester avec des sous requête, je pensais faire quelque chose du genre
    ( requete1 ) / (requete2) * 100 AS taux

    avec requete1 pour avoir le nombre de clients :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from Client client WHERE Client.idClient = Agent.idAgent
    et requete2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select count(*) from Client client , rendezvous rdv , agent ag WHERE client.idClient = agent.idAgent AND rdv.idClient = client.idClient AND client.idAgent=ag.idAgent HAVING COUNT(rdv.idRDV) > 1
    mais c'est de la **** pour être poli,

    Bref si quelqu'un à des pistes ça serait super.

    Merci beaucoup

    Nico

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Bonjour,
    Voici une base, à customiser (il peut y avoir des fautes de frappe, je n'ai pas testé)


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Select AG.idagent
         , AG.nom
         , AG.prenom
         , coalesce(SQ.NBR, 0)      
    from agent AG
    left join 
         (select idagent  as ida
               , count(*) as nbr
          from rendezvous
          where RV.dateDebutPrevue between '2017-06-01' and '2017-06-31'
          group by idagent) SQ 
      on SQ.ida=AG.idagent

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    Merci !

    je vais étudier ça, et en apprendre (j'ai jamais vu coalesce ) un peu plus en SQL !

    Je posterai mon avancement,

    Merci pour ton temps en tout cas

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    merci escartefigue,

    ça marche , j'ai maintenant une jointure pour récupérer le nombre de rendez vous du mois courant par client .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    	SELECT
     
    		AG.* , coalesce(SQ.NBR, 0) AS nbRDVs
     
    	FROM 
    		Utilisateur AG
    	LEFT JOIN
     
    	 (select idUtilisateur, count(*) as nbr
          from RDV RV
          where RV.dateDebutPrevue between '2017-06-01 00:00:00' and '2017-06-31 00:00:00'
          group by idUtilisateur) SQ  ON SQ.idUtilisateur=AG.idUtilisateur
    première étape DONE (proprement) même si je galère à comprendre le comportement de coalesce

    je vais me remettre sur la 2eme partie.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    Comme j'imagine que certains agents peuvent n'avoir aucun rendez vous, j'ai fait une jointure outer

    Par conséquence, le résultat peut être nul pour certains agents

    coalesce (colonne1, colonne2, ..., valeur) permet de sélectionner la 1ère colonne non nulle de la liste entre parenthèses, et à défaut, la valeur spécifiée

  6. #6
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    Tout à fait, ça m'a même montré que ma requête etait fausse car je n'avais pas tous les agents.. +1 +1

    Et je commence à réussir la 2eme partie grace à ta requete. C'est terrible ce coalesce !

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    donc sur le même principe j'ai ajouté une nouvelle jointure pour avoir le nombre de client par agent :

    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
    20
    21
     
    SELECT
    		AG.idAgent, AG.email  , 
    		coalesce(sqRDV.nbr, 0) AS nbRDVsMensuel,		
    		coalesce(sqClient.nbr, 0) AS nbClients
    	FROM 
    		Utilisateur AG
     
    	LEFT JOIN
     
    		 (select idAgent, count(*) as nbr
    		  from RDV RV
    		  where RV.dateDebutPrevue between '2017-06-01 00:00:00' and '2017-06-31 00:00:00'
    		  group by idAgent) sqRDV  ON sqRDV.idAgent=AG.idAgent
     
    	LEFT JOIN 
     
    		(
    		select client.idAgent, count(*) as nbr
    		  from Client client
    		  group by idAgent) sqClient  ON sqClient.idAgent=AG.idAgent
    Maintenant il me reste le plus compliqué : le nombre de client qui ont au minimum 2 rendez vous

    Il faut donc une nouvelle jointure

    J'ai fait cette requête, qui me renvoie Tous les clients avec leur nombre de rendez-vous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	SELECT 
    		client.idClient, client.idAgent, coalesce(sqRDV2.nbr, 0) AS nbr
    	FROM
    		Client client
    	LEFT JOIN 
    		(	SELECT rdv.idRDV, rdv.idClient, count(*) as nbr
    			FROM RDV rdv
    			GROUP BY rdv.idClient
    			) sqRDV2 ON sqRDV2.idClient = client.idClient 
    	WHERE client.idAgent IS NOT NULL
    Maintenant je dois "l'imbriquer" mais là je galère vraiment et je stagne.. Je pense qu'il manque une étape, le COUNT sur les clients issus de cette requête mais je ne voit pas comment faire..

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 385
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 385
    Points : 39 883
    Points
    39 883
    Billets dans le blog
    9
    Par défaut
    A quoi doit ressembler le résultat attendu ?

    Une remarque : faire une requête OUTER JOIN en filtrant les résultats non nuls, revient à faire une requête INNER JOIN

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Février 2011
    Messages : 192
    Points : 107
    Points
    107
    Par défaut
    OK merci pour l'info sur le OUTER , je vais pouvoir "corriger" quelques requêtes


    Le resultat de la requête qui me donne le nombre de client par agent renvoie :
    Nom : resSQL.png
Affichages : 183
Taille : 9,2 Ko


    A la fin, ce que je veux avoir comme résultat :

    idAgent - nbRDVsMensuel - nbClients - nbClientsPlusieursRDV

    J'ai mes 3 premières colonnes grâce çà la requête

    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
     
    	SELECT
    		AG.idAgent, 
    		coalesce(sqRDV.nbr, 0) AS nbRDVsMensuel,		
    		coalesce(sqClient.nbr, 0) AS nbClients
    	FROM 
    		Utilisateur AG		
    	LEFT JOIN     
    		 (select idAgent, count(*) as nbr
    		  from RDV RV
    		  where RV.dateDebutPrevue between '2017-06-01 00:00:00' and '2017-06-31 00:00:00'
    		  group by idAgent) sqRDV  ON sqRDV.idAgent=AG.idAgent	  
    	LEFT JOIN 	
    		(
    		select client.idAgent, count(*) as nbr
    		  from Client client		  
    		  group by idAgent) sqClient  ON sqClient.idAgent=AG.idAgent
    maintenant reste à obtenir la dernière colonne en "matchant" la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT 
    		client.idClient, client.idAgent, coalesce(sqRDV2.nbr, 0) AS nbr
    	FROM
    		Client client
    	LEFT JOIN 
    		(	SELECT rdv.idRDV, rdv.idClient, count(*) as nbr
    			FROM RDV rdv
    			GROUP BY rdv.idClient
    			) sqRDV2 ON sqRDV2.idClient = client.idClient 
    	WHERE client.idAgent IS NOT NULL
    (si je ne me trompe pas)

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

Discussions similaires

  1. Requête avec somme et calculs
    Par LadyArwen dans le forum Requêtes et SQL.
    Réponses: 25
    Dernier message: 07/07/2010, 15h12
  2. [AC-2003] Requête avec un champ calculé et des conditions dans le calcul ?
    Par [ZiP] dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 30/01/2010, 11h58
  3. Critères avec opérateurs dans une requête avec des champs calculés
    Par lmollard dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/05/2008, 19h53
  4. Calcul facture avec différents taux de TVA
    Par Koopa55 dans le forum Excel
    Réponses: 4
    Dernier message: 23/01/2008, 11h01
  5. Calcul requête avec conditions multiples
    Par Phullbrick dans le forum Access
    Réponses: 7
    Dernier message: 18/04/2006, 14h45

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