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

Requêtes et SQL. Discussion :

Requête pour agenda : le casse tête


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut Requête pour agenda : le casse tête
    Bonjour à tous

    Dans la requête ci dessous qui fonctionne bien je peux voir la colonne des horaires à gauche et la colonne des contacts qui ont un rendez-vous à l'heure indiquée :

    10:00 Mme Greluche
    10:15 Mme Greluche
    10:30 Mme Greluche
    11:00 Mr Lidiau
    11:15 Mr Lidiau

    Comment faire en sorte que la liste complète d'horaires figure dans le résultat de la requête même si la valeur adjacente est nulle pour avoir le résultat suivant ?

    9:00
    9:15
    9:30
    9:45
    10:00 Mme Greluche
    10:15 Mme Greluche
    10:30 Mme Greluche
    10:45
    11:00 Mr Lidiau
    11:15 Mr Lidiau

    (la table T_horaires_intervenants) fournit la liste complète des horaires d'une journée par intervalle donné (une fonction qui a été créée au préalable remplit la table des horaires suivant un horaire de début puis de fin, un intervalle etc...)

    Je suppose qu'il faut une requête union / analyse croisée , comment procéderiez vous ?
    Peut on utiliser un PIVOT sur des jours de semaine ? ou bien je devrais ensuite rassembler 7 requêtes union dans une seule pour avoir une semaine entière de données en un seul coup d'oeuil ?

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Horaires_Intervenants.Heure, RqContacts.Contact
    FROM T_Horaires_Intervenants, RqContacts INNER JOIN T_RendezVous ON RqContacts.NumContact = T_RendezVous.NumContact
    WHERE (((T_RendezVous.DateDebut)=#11/30/2015#) AND ((T_Horaires_Intervenants.IdIntervenant)=7) AND ((TimeValue([HoraireDebut]))<=TimeValue([heure])) AND ((TimeValue([horairefin]))>=TimeValue([heure])));

    Merci d'avance

  2. #2
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour,
    Il faut utiliser un LEFT JOIN au lieu d'un INNER JOIN.
    Cordialement
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  3. #3
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Bonjour et merci pour cette réponse si rapide, malheureusement Access me dit "SQL non éxécuté car jointures externes ambigues"

    J'ai essayé de créer une nouvelle requête reprenant les données de la première en lui rajoutant ensuite le champ [contact] de [rq_contacts] et lui faisant un LEFT Join et le résultat n'est pas bon, tous les contacts sont montrés et seulement certains horaires en bas de page ...

    Le sql donnerait :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Rq_Rendez_vous_jour.Heure, RqContacts.Contact
    FROM RqContacts LEFT JOIN Rq_Rendez_vous_jour ON RqContacts.NumContact = Rq_Rendez_vous_jour.NumContact;

    Le but recherché est de montrer correlativement la colonne heure et seulement les contacts qui sont en rendez-vous pour une heure donnée.
    Je me suis demandé si ce n'étaient pas mes conditions de filtre dans la première requête qui restreindraient trop le résultat et donc que l'on devrait réflechir à un nouveau filtre.

    J'ai essayé de mettre un critère puis un "EstNull()" dans la colonne "Où" de l'éditeur mais ça ne changeait rien au résultat, il est évident que je m'y prends mal ...

    Merci de m'aiguiller

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Il manque une liaison entre la table des horaires et celle des rendez-vous. Comme le dit Madefemere ça s'écrit
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select ... 
    from horaires left join rendezvous on ... left join contacts on ...
    where ...
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Il n'y a pas de champ commun utilisable dans la table t_horaires_intervenants avec la table T_Rendezvous excepté IdIntervenant et lorsque je fais un Left Join dessus rien ne change ...

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Pourtant il faut bien lier l'heure de rendez-vous et les créneaux horaires !
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Bonjour clickandgo,

    Comme dit Nico, je ne comprends pas comment tu peux utiliser 2 tables ou requêtes dans une requête sans avoir de liaison entre elles, sauf à faire un produit cartésien.
    Soit, tu as tes 2 tables ou requêtes :
    Nom : Liason_Gauche_1.JPG
Affichages : 141
Taille : 49,9 Ko

    Tu crées une requête en ajoutant d'abord la table qui contient "le plus d'enregistrement" ou celle dont les enregistrements doivent tous être affichés.
    Tu lies les 2 objets avec les champs correspondants (heure et HeureRDV j'imagine). TU double-cliques sur la ligne qui fait la liaison pour choisir l'option qui te convient.
    Tu mets dans la grille d'interrogation les champs que tu voir en résultat :
    Nom : Liason_Gauche_2.JPG
Affichages : 149
Taille : 38,6 Ko

    Et tu as ton résultat :
    Nom : Liason_Gauche_3.JPG
Affichages : 121
Taille : 27,2 Ko

    En pièce jointe, la très petite base exemple :R_LiaisonGauche_ToutAfficher.zip

    Cordialement,
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci Madefemere pour tout ce travail mais cela avait déjà été fait à son époque

    J'ai recréé cette requête simple en vérifiant d'abord chaque requête en séparé mais dès que je les rassemble en LEFT JOIN plus aucun résultat n'apparait (Il n'y a pas non plus de message d'erreur).

    J'ai vérifié aussi le format des champs Heure et HeureDebut il est le même donc compatible avec la liaison.
    Il existe aussi des données pour chaque table/champ ...

    Je ne vois donc pas du tout ce qui cloche

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_RendezVous.IdIntervenant, T_RendezVous.NumContact, T_RendezVous.DateDebut, T_RendezVous.HeureDebut
    FROM T_Horaires_Intervenants LEFT JOIN T_RendezVous ON T_Horaires_Intervenants.Heure = T_RendezVous.HeureDebut
    WHERE (((T_RendezVous.IdIntervenant)=7) AND ((T_RendezVous.DateDebut)=#11/30/2015#));

  9. #9
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Et comme cela :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT T_Horaires_Intervenants.Heure,T_RendezVous.IdIntervenant, T_RendezVous.NumContact, T_RendezVous.DateDebut, T_RendezVous.HeureDebut
    FROM T_Horaires_Intervenants LEFT JOIN T_RendezVous ON T_Horaires_Intervenants.Heure = T_RendezVous.HeureDebut
    WHERE (((T_RendezVous.IdIntervenant)=7) AND ((T_RendezVous.DateDebut)=#11/30/2015#));

    je le précise ici :
    Tu crées une requête en ajoutant d'abord la table qui contient "le plus d'enregistrement" ou celle dont les enregistrements doivent tous être affichés.
    Cordialement,
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Toujours aucune donnée d'affichée

    Il doit bien y avoir un bug quelque part que j'arrive pas à voir ...
    Le plus incroyable c'est que si je sépare en deux parties ça marche mais dès que je lie plus rien ...
    Si je fais le lien en Right join toutes les données s'affichent exceptées la colonne des horaires d'intervenants, bizarre bizarre

    J'ai l'impression qu'il doit y avoir un problème de concordance de format de date quelque part

    J'ai même essayé dans une nouvelle base : même résultat

  11. #11
    Expert éminent

    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    3 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 840
    Points : 7 974
    Points
    7 974
    Par défaut
    Peux-tu poster la requête et les tables concernées.
    Mandresy
    "Je ne sais qu'une chose, c'est que je ne sais rien" Socrate

    N'oublions pas de mettre quand on a trouvé notre bonheur. Soyons sympa pour les futurs heureux.

    Merci, c'est toujours sympa de recevoir des de votre part

  12. #12
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 62
    Points : 97
    Points
    97
    Par défaut Requête pour agenda : le casse tête
    Bonjour,

    La solution de madefemere fonctionne car il n'y a pas de conditions.

    Donc je pense qu'il faut d'abord faire une requête ( exemple : R_Id_RDV) sur ta table T_RendezVous avec les filtres qui vont bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (WHERE (((T_RendezVous.IdIntervenant)=7) AND ((T_RendezVous.DateDebut)=#11/30/2015#)))
    Puis faire une requête avec la table T_Horaires_Intervenants (où il y a toutes les plages horaires) et la requête précédente en mettant LEFT JOIN et la jointure entre les 2 champs "heure"

    exemple :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT T_Horaires_intervenants.Heure, R_Id_RDV.* FROM T_Horaires_intervenants LEFT JOIN R_Id_RDV ON T_Horaires_intervenants.Heure = R_Id_RDV.HeureDebut;

    A+
    Bonne journée

  13. #13
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Bonjour,

    Si le right join remonte les rendez-vous c'est que T_Horaires_Intervenants.Heure et T_RendezVous.HeureDebut ne sont pas le même jour
    Il faudrait donc faire la liaison seulement sur l'heure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    on format(T_Horaires_Intervenants.Heure,'hhmm')=format(T_RendezVous.HeureDebut,'hhmm')
    Par ailleurs, quand on pose des conditions sur la table de droite d'un left join il faut prévoir que les données peuvent être nulles (sinon ça revient à un inner join) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (((T_RendezVous.IdIntervenant)=7 or T_RendezVous.IdIntervenant is null) AND (( T_RendezVous.DateDebut)=#11/30/2015#) or T_RendezVous.DateDebut is null)
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  14. #14
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci à tous pour vos réponses

    Je progresse lentement ...

    J'ai créé 2 requêtes qui alimentent une dernière car le Left Join n'acceptait pas la fonction Format suggérée par Nico, ces requêtes formatent d'abord les champs "heure" qui serviront à la jointure.

    Cependant je me demande : comment se fait il que les champs "heure" qui sont au niveau des tables exactement au même format ne peuvent servir de liaison sans qu'on les reformate à nouveau ? Serait-il que des secondes sont quand même enregistrées malgré que les 2 champs soient spécifiés en "heure abrégée" ?

    La requête finale me montre maintenant les bonnes données excepté qu'elle omet certains horaires de la table des horaires d'intervenants.

    Voici la requête finale qui ne donne pas encore le résultat escompté mais on s'en approche...

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT [Rq Horaires intervenants].valHeure, Rq_Horaires_rdv.NumContact
    FROM [Rq Horaires intervenants] LEFT JOIN Rq_Horaires_rdv ON [Rq Horaires intervenants].valHeure = Rq_Horaires_rdv.valHeureDebut
    WHERE (((Rq_Horaires_rdv.IdIntervenant)=7) AND ((Rq_Horaires_rdv.valDateDebut)=#11/30/2015#)) OR (((Rq_Horaires_rdv.NumContact) Is Null) AND ((Rq_Horaires_rdv.IdIntervenant) Is Null));

  15. #15
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Citation Envoyé par clickandgo Voir le message
    comment se fait il que les champs "heure" qui sont au niveau des tables exactement au même format ne peuvent servir de liaison sans qu'on les reformate à nouveau ? Serait-il que des secondes sont quand même enregistrées malgré que les 2 champs soient spécifiés en "heure abrégée" ?
    Sauf erreur, "heure abrégée" est un format d'affichage à l'écran qui ne dit rien sur le contenu du champ, ce qui confirme mon idée de dates à la même heure mais sur des jours différents.

    On peut mettre un format dans une jointure, par contre c'est un peu long à l'exécution et je me suis trompé dans la formule : chez access mm renvoie le mois, il faut donc écrire format(madate,'hhnn') !
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  16. #16
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Je te remercie Nico84, j'avais pensé à le faire mais l'éditeur continuait à me dire qu'il ne pouvait éxécuter la jointure alors j'ai décidé de poursuivre en faisant 2 petites requêtes ...

  17. #17
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 087
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 087
    Points : 5 203
    Points
    5 203
    Par défaut
    Les sous-requetes c'est bien aussi...

    S'il manque des données c'est que tu t'es embrouillé dans ton WHERE. Il ne faut pas utiliser l'éditeur de requete qui ajoute des () à tire-larigot et souvent au mauvais endroit mais s'habituer à taper directement les requetes en SQL. Sans parler du fait que l'éditeur est limitatif pour les sous-requetes et les fonctions appelées

    Dans une left join il faut autant que possible filtrer sur la table de gauche et toujours mettre ... or ... is null dans les filtres sur la table de droite
    Pour bien comprendre comment SQL fait une jointure il est intéressant de l'afficher d'abord sans where : on voit les doublons, les lignes vides à droite...

    Courage tu y es presque
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  18. #18
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 092
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 092
    Points : 268
    Points
    268
    Par défaut
    Merci Nico84cela m'a été d'une grande aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 03/11/2015, 10h25
  2. Requête statistiques imbriquées : Le casse tête !
    Par clickandgo dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 22/03/2012, 18h26
  3. casse tête pour choper des colones d'une requète ?:?
    Par hiul dragonfel dans le forum Langage
    Réponses: 3
    Dernier message: 12/11/2009, 17h57
  4. requête casse-tête pour une seule table..
    Par MikeV dans le forum Requêtes
    Réponses: 9
    Dernier message: 23/08/2007, 21h02
  5. requête SQL un peu casse tête
    Par hellbilly dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/12/2005, 10h03

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