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 SQL retournant des champs différents selon une condition [AC-2003]


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Requête SQL retournant des champs différents selon une condition
    Bonjour,

    J'ai un problème que je n'arrive pas à résoudre seul. Votre aide serait très appréciée. J'ai trois tables liées dans Access 2003:

    - Table_Dossiers, avec un champ RéfDossier et d'autres champs;
    - Table_Contacts, avec un champ RéfContact, RéfDossier, RéfAdresse, TypeAdresse et d'autres champs;
    - Table_Adresses, avec un champ RéfAdresse, AdresseBureau, AdresseMaison et d'autres champs.

    Un dossier peut avoir plusieurs contacts. Chaque contact a une adresse, qui peut être à la maison (1) au bureau (2). Le type d'adresse est inscrit dans le champ [TypeAdresse] dans Table_Contacts qui fait la liaison entre Table_Dossiers et Table_Adresses.

    Je cherche à écrire une requête SQL qui retournera pour un dossier donné en une seule chaine:
    - l'adresse au bureau ou à la maison pour le premier contact au dossier seulement, selon le type d'adresse spécifié dans Table_Contacts,
    - suivi d'une indication qu'il y d'autres contacts ou non associé au dossier.

    Par exemple, si 3 contacts font référence au dossier 1 avec le premier contact ayant une adresse au bureau, la requête SQL devrait retourner quelque chose comme:
    Adresse au bureau contact 1...(contacts multiples)

    Si un seul contact fait référence au dossier 2 avec une adresse à la maison, le résultat serait quelque chose comme:
    Adresse à la maison contact (contact unique)

    J'ai cherché et cherché sur le net mais n'ai pas trouvé de solution. Merci d'avance pour votre aide.

    Luc

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    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 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Bonjour,

    Vu la complexité de l'affaire il faudrait plus d'explications et des exemples, voire l'algo détaillé du truc

    A mon avis la solution la plus simple consiste à écrire une fonction publique en vba (avec des if et des concaténations et tout ça) et ensuite de l'utiliser dans la requête SQL :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select MonDossier, Machaine(MonDossier) from MaTable where ...

    Si cela s'avère trop lent à l'exécution il sera toujours temps de voir s'il est possible de retranscrire directement la fonction MaChaine en SQL

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Nico,

    La fonction en VBA est à exclure (ça, je saurais comment m'y prendre). J'ai besoin du résultat directement par requête SQL. J'ai essayé en utilisant des SELECT, COUNT, et IIF, mais rien n'y fait.

    Jusqu'ici:

    SELECT (
    IIF(
    (SELECT Count( Contacts.RéfContact)
    FROM Contacts
    WHERE Contacts.RéfDossier=1)
    >1,"plusieurs","un seul")
    ) AS NbrContacts
    FROM Dossiers
    WHERE Dossiers.RéfDossier=1;

    Ça me retourne "plusieurs" pour le dossier 1 (c'est le cas dans l'exemple que j'ai donné).

    SELECT (
    IIF ((SELECT TOP 1 Contacts.TypeAdresse FROM Contacts WHERE Contacts.RéfDossier=1)=1,
    "Adresse_Bureau",
    "Adresse_Maison")
    )
    FROM Dossiers
    WHERE Dossiers.RéfDossier=1;

    Ça me retourne "Adresse_Bureau" pour le 1er contact au dossier 1 (c'est le cas dans l'exemple que j'ai donné).

    J'ai tenté de combiner les 2 requêtes mais ça ne fonctionne pas. D'apès mes tests, avec un IIF dans une requête SQL, il n'est apparemment pas possible de retourner autre chose qu'une constante (autrement dit, pas possible de retourner le résultat d'une autre requête SELECT).

    Alors je suis bloqué là. Dans le pire des cas, je voudrais récupérer la bonne adresse (bureau ou maison) du premier contact dans un dossier. Je suis sûr que c'est possible, sauf que c'est pas évident et c'est pour ça que je demande sur ce forum. Et si possible, je voudrait concaténer à l'adresse une indication qu'il y a plusieurs contacts ou un seul pour le dossier. Voilà. C'est certainement un problème pour une personne calée en requête SQL...

    Le défi est lancé à tous. Merci.

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 107
    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 107
    Points : 5 230
    Points
    5 230
    Par défaut
    Citation Envoyé par lucmorin Voir le message
    La fonction en VBA est à exclure (ça, je saurais comment m'y prendre). J'ai besoin du résultat directement par requête SQL.
    La 2e phrase n'explique pas la 1ere puisqu'une requête SQL peut appeler une fonction publique

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour Nico,

    Tu as bien raison. J'ignorais que c'était possible sous Access. Et en plus, j'avais déjà programmé les fonctions nécessaires en VBA pour retourner le bonne adresse! En fouillant un peu dans le forum, j'ai vu comment s'y prendre pour utiliser une fonction publique dans une requête SQL. Alors c'est réglé. Merci pour l'aide.

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

Discussions similaires

  1. Créer des champs texte selon une valeur saisie
    Par alfred5 dans le forum NetBeans
    Réponses: 6
    Dernier message: 25/06/2011, 14h20
  2. requête sql : concaténation des champs dans tableau
    Par tvcinq dans le forum Requêtes
    Réponses: 1
    Dernier message: 17/09/2010, 08h59
  3. Réponses: 3
    Dernier message: 26/07/2009, 10h06
  4. Réponses: 2
    Dernier message: 07/06/2007, 16h07
  5. [Requête/SQL]ajouter un champ calculé dans une table
    Par zougna dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 17/04/2007, 19h09

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