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 :

[2003] requête avec iif récupere valeur d'un champ - pourquoi ça ne marche pas ?


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut [2003] requête avec iif récupere valeur d'un champ - pourquoi ça ne marche pas ?
    Salut tlm...

    je construis une requete basée sur une autre qui contient 3 colonnes : ID_UD , ID_TYP_CAP et CompteDeID_CAPTAGE... ID_UD apparait plusieurs fois s'il y'a plusieurs types de captages concernés.

    La nouvelle requête doit me permettre de n'avoir l'ID_UD qu'une seule fois, avec le compte du nombre de fois où elle apparait dans la requete précédente... jusque là tout va bien. La 3eme colonne doit contenir une valeur texte en fonction de ce compte : si celui ce est >1, alors la valeur est "mixte", sinon il faut récupérer la valeur ID_TYP_CAP de la requête sur laquelle je m'appuie.

    Je l'ai tourné différement pour écrire la requete : si le compte =1, récupère la valeur du champ ID_TYP_CAP, sinon, remplit avec "mixte"... voir le code ci-dessous...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qry_UDI_TYP_CAP_DERIV.ID_UD, Count(qry_UDI_TYP_CAP_DERIV.ID_UD) AS CompteDeID_UD, IIf([CompteDeID_UD]=1,[qry_UDI_TYP_CAP_DERIV]![ID_TYP_CAP],"Mixte") AS TypeUD
    FROM qry_UDI_TYP_CAP_DERIV
    GROUP BY qry_UDI_TYP_CAP_DERIV.ID_UD;
    Or impossible d'exécuter la requête, le fait que je lui demande de me mettre la valeur contenue dans [qry_UDI_TYP_CAP_DERIV]![ID_TYP_CAP] ne passe pas...(erreur 3122).

    pourquoi ?

    Merci de m'aider

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    essaie de rajouter ton champ de le group by

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT qry_UDI_TYP_CAP_DERIV.ID_UD, Count(qry_UDI_TYP_CAP_DERIV.ID_UD) AS CompteDeID_UD, IIf([CompteDeID_UD]=1,[ID_TYPE_CAP],"Mixte") AS TypeUD
    FROM qry_UDI_TYP_CAP_DERIV
    GROUP BY qry_UDI_TYP_CAP_DERIV.ID_UD, qry_UDI_TYP_CAP_DERIV.ID_TYPE_CAP;

  3. #3
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Essai avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CASE TonChamps
            WHEN TonChamps = 1 THEN 'Mixte'
            WHEN Tonchamps <> 1 THEN ...
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Merci...

    La solution de Sunbeam provoque un prompt pour me demander 2 fois d'entrer une valeur de paramètre (pour ID_TYP_CAP et pour qry_UDI_CAP_DERIV.ID_TYP_CAP...) main ne provoque pas le résultat attendu.

    Chtulus : Je mets ça où dans le SQL ? Je suis pas très doué hein...

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Et bien dans ton SELECT

    Sachant que tu peux dans ta clause WHERE
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Ce genre là ?
    Je ne savais même pas que l'on pouvait mettre un case dans du sql... et une recherche dans le forum ne m'envoie que sur du vba :/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT qry_UDI_TYP_CAP_DERIV.ID_UD, Count(qry_UDI_TYP_CAP_DERIV.ID_UD) AS CompteDeID_UD, (SELECT CASE qry_UDI_TYP_CAP_DERIV.ID_UD  WHEN qry_UDI_TYP_CAP_DERIV.ID_UD = 1 THEN "Pas Mixte"  WHEN qry_UDI_TYP_CAP_DERIV.ID_UD  <> 1 THEN "Mixte") As TYPUD
    FROM qry_UDI_TYP_CAP_DERIV
    GROUP BY qry_UDI_TYP_CAP_DERIV.ID_UD;
    ça me paraissait pourtant simple avec mon iif de base si ce n'est qu'il ne veut pas récup la valeur du champ...


    Ohlala je suis en train de m'embrouiller total !!!

  7. #7
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Oulah,

    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 qry_UDI_TYP_CAP_DERIV.ID_UD, 
               Count(qry_UDI_TYP_CAP_DERIV.ID_UD) AS CompteDeID_UD, 
               CASE qry_UDI_TYP_CAP_DERIV.ID_UD  
                       WHEN qry_UDI_TYP_CAP_DERIV.ID_UD = 1 THEN "Pas Mixte"
                       WHEN qry_UDI_TYP_CAP_DERIV.ID_UD  <> 1 THEN "Mixte"
               END AS TYPUD
     
    FROM 
           qry_UDI_TYP_CAP_DERIV
     
    GROUP BY 
                 qry_UDI_TYP_CAP_DERIV.ID_UD
    ;
    Mieux non, pour la lecture aussi ?
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    ok merci, je capte un peu mieux la syntaxe du case dans le sql maintenant...

    Mais ça ne marche pô... "erreur de syntaxe : opérateur absent dans l'expression gnagnagna..." me dit access...
    Et du coup on a un peu quitté le fond du problème, qui consistait à récupérer la valeur du champ ID_TYP_CAP de la requete qry_UDI_TYP_CAP_DERIV lorsque le compte = 1...

    Bon peut être que je fais compeletement fausse route pour arriver à mes fins, alors je résume la démarche :
    - Donnees de base provenant de 2 tables : UD et CAPTAGES, (1 UD = n CAPTAGES, clé étrangere ID_UD dans la 2nde table)
    - A partir de ces 2 tables, je fait une requete qui servira de référence, en récupérant les champs dont j'ai besoin et en appliquant un WHERE sur un champ qui dit si l'enregistrement est à considérer comme valide (VALIDE = -1)
    Cette requete s'appelle qry_UDI_TYPE_CAP_BASE...
    - A partir de cette derniere, je fais une nouvelle requête qui s'appelle qry_UDI_TYP_CAP_DERIV, qui comprend 3 colonnes : ID_UD regroupées, ID_TYP_CAP regroupés, et Compte de ID_CAPTAGE

    Le résultat :
    ID_UD ID_TYP_CAP CompteDeID_TYP_CAP
    1 source 3
    2 source 5
    3 forage 1
    4 forage 1
    4 source 2

    - A partir de là, nouvelle requête, la fameuse qry_TYP_CAP_CAT que j'essaie de créer, le but étant d'avoir 3 colonnes : ID_UD regroupées (et donc l'UD N°4 qui apparait 2 fois ci dessus ne devrait apparaitre qu'une fois) tandis que le compte du nombre d'apparition dans la précédente requête donne 2... Et c'est à partir de ce compte que je veux affecter une valeur à une 3 è colonne, à savoir "mixte" si le nb >1, ou ID_TYP_CAP si il n'y a qu'un seul type de captage pour l'UD en cours... Et là je bloque ARGHHH !


    Edit : je viens de lire dans la page sur les fonctions SQL (http://sqlpro.developpez.com/cours/sqlaz/fonctions/) que CASE n'était pas pris en charge par ACCESS... Quid ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Pas très académique mais semble fonctionner... Qu'en pensent les puristes ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT qry_UDI_TYP_CAP_DERIV.ID_UD, 
    Count(qry_UDI_TYP_CAP_DERIV.ID_UD) AS CompteDeID_UD, 
    Max(qry_UDI_TYP_CAP_DERIV.ID_TYP_CAP) AS MaxDeID_TYP_CAP, 
    IIf([CompteDeID_UD]=1,[MaxDeID_TYP_CAP],"Mixte") AS Expr1, 
    IIf([Expr1]="1","Source",IIf([Expr1]="2","Forage","Mixte")) AS Expr2
    FROM qry_UDI_TYP_CAP_DERIV
    GROUP BY qry_UDI_TYP_CAP_DERIV.ID_UD;

  10. #10
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Si cela fonctionne !

    Mais donc c'est uniquement dans les cas ou le résultat est 1 ou 2...
    « Je ne cherche pas à connaître les réponses, je cherche à comprendre les questions. »
    - Confucius -

    Les meilleurs cours, tutoriels et Docs sur les SGBD et le SQL
    Tous les cours Office
    Solutions d'Entreprise



  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 71
    Points : 40
    Points
    40
    Par défaut
    Ben en fait, j'ai une table "libellé" a coté qui normalement établit les correspondances : 1 sont les sources, 2 les forages... c'est pour ça que j'ai un champ expr2 qui refait cette correspondance en texte... j'aurai surement pu faire la même chose si j'avais eu plus de types de captages...

    Cette base est un gros machin dont je ne connais pas tout les secrets :/

    Par contre cette solution rappelle une question que je me suis souvent posé et pour laquelle je n'ai jamais eu vraiment de réponse :
    Vous remarquerez que je suis passé par un Max(), parcequ'il fallait bien que je mette quelquechose dans la ligne "opération" du QBE... mais bon dans d'autre cas je pense que je n'aurai pas pu... alors quelle est la parade dans ces autres cas ?

    Bon maintenant faut que je me reserve de tout ça pour calculer mes %...

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

Discussions similaires

  1. Requête avec inclusion de valeur non numérique
    Par Davidbrcz dans le forum Langage SQL
    Réponses: 14
    Dernier message: 06/11/2013, 01h29
  2. [AC-2003] requête avec taille fixe de champs
    Par falco- dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/02/2011, 19h19
  3. [AC-2002] Requête avec IIf et Dlast, champ sur une deuxième table
    Par mbuddy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/06/2009, 04h33
  4. [A-03] Requête avec toutes les valeurs d'un champ
    Par badeux dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/10/2008, 11h22
  5. requête avec IIf Null
    Par Nessie37 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/11/2007, 17h28

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