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 de non existence


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Requête de non existence
    J'ai un petit soucis, voici le MPD que j'ai joint au message,
    je voulais faire ressortir la liste des locataire qui n'ont pas fait l'objet de versement, pour effectuer un versement le locataire est enregistré dans la table verser, puis l'Id du MOIS aussi est associé, donc seuls les locataires ayant fait l'objet de verser peuvent se trouver dans cette table VERSER.

    Aidez moi
    Images attachées Images attachées

  2. #2
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Bonjour,
    Sous quel SGBD travailles-tu ?
    Pourrais-tu nous donner ton ébauche de requête pour que nous puissions t'aider ?

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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,

    Au vu du mpd je penses qu'il va vous manquer une table de calendrier qui vous permettra de lister facillement tous les couple année/mois pour une location.

    Une fois que vous aurez ça il suffira de tester la non existance (not exists) entre la table des versements et la table de location jointe à votre calendrier.

    edit : oui tout à fait asmduty, manque plus qu'a savoir s'il utilise MySql ou pas... mais vu le mpd il me semble que c'est du MySql Workbench => pas de recursion, ni fonction de fenetrage

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Points : 1 327
    Points
    1 327
    Par défaut
    Sachant qu'il y a une date de début et de fin de location logiquement pas besoin de nouvelle table

    Il faudrait chercher tous les couples mois/année non présents depuis le premier mois/année de location et le mois/année actuel avec le "not exists" comme l'a proposé punkoff

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par kokey Voir le message
    je voulais faire ressortir la liste des locataire qui n'ont pas fait l'objet de versement,
    Moi je comprends ça comme la liste des locataires n'ayant jamais fait de versement. Il suffirait donc de chercher les locataires qui n'existent pas dans la table verser.

  6. #6
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Plus de precision
    Bonjour,
    Au fait j'utilise la base de Données Mysql 5

    SVP si je comprend bien l'ébauche de requette dont vous me demander c'est un debut de ce que j'ai dejà commencer, si c'est cela ce n'est qu'un brullons qui n'a pas de sens.

    En plus j'ai dejà une table MOIS et au niveau des enregistrements dans la table VESER, cette dernière prend l'identité du locataire (idlocataire) l'identité de la table MOIS (idmois) et en plus de cela l'utilisateur saisie l'année dans la table VERSER.

    Donc je voulais avoir comme resultat, la liste des locataires qui n'ont jamais fait de versement et ceux qui ont fait aussi des veserment.
    Exemple nous somme en janvier, si nous prenons un intervalle de date qui couvre la periode de JANVIER à MARS ont doit pouvoir voir ceux qui n'ont jamais payer et ceux qui ont seulement payé pour le mois de janvier ou février et cette requette doit me sortir aussi bien les noms, et les mois impayés.
    Merci
    Images attachées Images attachées

  7. #7
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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,


    Je persisterai donc sur mon idée de base à savoir qu'il va vous manquer une table de type calendrier : calendrier (annee, mois).

    Ceci permettra de connaitre justement vos trous dans les versements en recoupant avec la plage de location.

    Donc creuser dans ce sens, et présentez des ébauches de requêtes.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT m.mois, l.nom, l.prenom
    FROM mois m
    LEFT OUTER JOIN verser v 
    	ON v.mois_idmois = m.idmois
    	AND v.anne = 2012
     
     
    	RIGHT OUTER JOIN locataire l 
    		ON l.idlocataire = v.locataire_idlocataire
     
    WHERE m.idmois BETWEEN 1 AND 3 
           AND v.locataire_idlocataire IS NULL

  9. #9
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Pas de plage de location dans la règle de gestion
    Le locations ici ne font pas l'objet de plage, un locataire qui loue une chambre doit payer regulièrement ses loyer aufur et à mesure que le mois finisse, dont ici il n'est pas question que le locataire a fait une location sur 12 MOIS c'est de Janvier 2012 à Décembre 2012, non il fait la locaton pour tout le temps que le propriètaire accepte toujours de mettre en location ses chambres. Donc c'es sur cet aspect que les verserments se font à chaque fin du mois en donnant les informations sur le locataire, le mois de location et on saisie l'année.
    Merci
    Images attachées Images attachées

  10. #10
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Bonjour CinePhil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT m.mois, l.nom, l.prenom
    FROM mois m
    LEFT OUTER JOIN verser v 
    	ON v.mois_idmois = m.idmois
    	AND v.anne = 2012
     
     
    	RIGHT OUTER JOIN locataire l 
    		ON l.idlocataire = v.locataire_idlocataire
     
    WHERE m.idmois BETWEEN 1 AND 3 
           AND v.locataire_idlocataire IS NULL
    Je viens d'executer votre code sql, le resultat m'a donné zero ligne, je crois c'est parceque la dernière ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.locataire_idlocataire is null
    ne trouve pas de correspondance car je crois à mon a avis et comprendre que pour cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v.locataire_idlocataire is null
    doit etre un champ et avoir comme valeur null

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    J'ai relu 3 fois et n'ai toujours pas compris votre explication.


    Vu que vous avez une date de début de location et une date de fin de location vous avez bien une plage durant laquelle votre location est active, non ?


    Bref, sinon votre résultat vous le chercher :
    - pour le mois en cours uniquement ?
    - pour l'année en cours (jusqu'au mois courrant) ?
    - tout l'historique ?

  12. #12
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Bonjour CinePhil
    Donc si j'enlève
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     AND v.locataire_idlocataire IS NULL
    , le resultat me donne plus la liste de ceux qui fait un versement dans l'année 2012 dont le mois se situ entre 1 et 3.

    Je crois ma solution serais le contraire du resultat que donne cette requête.
    Merci pour votre aide, je crois que nous y arriverons à trouver la meilleur requête.
    Merci

  13. #13
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Bonjour punkoff
    ce que signifie date debut et fin loacation dans la Table louer
    Ces deux dates sont la periode que couvre les Avances juste a la location, donc après versement de cette avance le locataire à l'obligation de commenecer par payé à chaque fin du mois et c'est cette somme qui est enregistrer dans la table VERSER. et c'est sur cette table qu'on doit chercher ceux qui n'ont pas fait de versement.
    Merci

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Et quand une location n'est plus active que se passe-t-il ?
    Vous effacez physiquement la ligne concernée de la table louer ?

  15. #15
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Bonjour punkoff
    Je mets à jour ces lignes qui ont été occuper par un locataire, dans un champs qui prendra comme information expiré, pour signifier que la location est expiré.
    Merci

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Et votre requête devra pouvoir aussi retourner les résutlats sur plusieurs années ? (par exemple de septembre 2011 à Mars 2012)

  17. #17
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Bonjour punkoff
    Non seulement sur periode couvrant une année seulement.
    Merci.

  18. #18
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Ma requête ne fonctionnait effectivement pas.

    Pour avoir les locataires qui n'ont pas versé le mois de janvier, tu peux faire cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT l.nom, l.prenom
    FROM locataire l
    LEFT OUTER JOIN verser v 
    	ON v.locataire_idlocataire = l.idlocataire
    	AND v.anne = 2012
    	AND v.mois_idmois = 1
    WHERE v.locataire_idlocataire IS NULL
    Par contre, si tu allonge la période sur plusieurs mois, tu n'auras que les locataires qui n'ont jamais payé durant toute la période mais pas ceux qui ont payé certains mois et pas d'autres. Et tu ne sauras pas quel(s) mois ont été payés ou non.

    Je n'ai pour le moment pas trouvé de solution à ton problème en apparence simple.

  19. #19
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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,

    il suffit d'adapter la requete a cinephil, en faisant un cross join entre la table louer et les mois, apres en gardant la même structure ca fonctionne

    edit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT l.nom, l.prenom, a.chambre_idchambre, a.mois
    FROM (select a.chambre_idchambre, a.locataire_idlocataire, b.idmois, b.mois from louer a, mois b where b.mois between 1 and 5) a
    inner join locataire l on l.idlocataire = a.locataire_idlocataire
    LEFT OUTER JOIN verser v 
    	ON v.locataire_idlocataire = a.locataire_idlocataire 
    	AND v.chambre_idchambre = a.chambre_idchambre
    	AND v.annee = 2011
    	AND v.mois_idmois = a.idmois
    WHERE v.locataire_idlocataire IS NULL

  20. #20
    Candidat au Club
    Inscrit en
    Septembre 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 16
    Points : 4
    Points
    4
    Par défaut Bonsoir punkoff, CinePhil
    Ok, je Vais essai et je vous donnerai la suite, merci pour tout votre attention que vous avez pour moi.

    Kokey

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/04/2013, 12h38
  2. Réponses: 6
    Dernier message: 10/02/2006, 13h46
  3. Réponses: 8
    Dernier message: 26/01/2006, 14h47
  4. Réponses: 9
    Dernier message: 17/03/2005, 09h20
  5. Requète avec NOT EXISTS
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 15h20

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