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]Conditions dans un champs calculé


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Points : 38
    Points
    38
    Par défaut [Requête/SQL]Conditions dans un champs calculé
    Bonjour,

    Actuellement en stage je dois mettre en place une application ACCESS or je ne maitrise pas vraiment ce logiciel.

    J'ai, (entre autres) 4 tables :
    - 1 table QUESTIONS avec les champs : n°_etude, type_question, modalite_min, modalite_max
    Les type de question sont : questions PROFILS, CHOIX ATT et CARAC ATT.
    - 1 table PROFIL avec les champs : n°_etude, note
    - 1 table CHOIX ATT avec les champs : n°_etude, note
    - 1 table CARAC ATT avec les champs : n°_etude, note
    Le champs NOTE correspond à une note donnée sur une échelle de notation pouvant être de 1 à 5, ou de 1 à 7, ou de 1 à 9.

    L'objectif est de calculer une note "pondérée" en fonction du type de la question et de l'échelle de notation.

    EXEMPLE :
    SI type_question = 'PROFIL' ALORS ouvrir table PROFILS.note
    SI modalite_min = 1 ET modalite_max = 5
    ALORS note_pondéré = (note/5)*10
    SINON SI modalite_min = 1 ET modalite_max = 7
    ALORS note_pondéré = (note/5)*10
    ...
    SINON SI type_question = 'CHOIX ATT' ALORS ouvrir table CHOIXATT.note
    ...

    => si j'ai telle question ET telle échelle Alors j'applique ce calcul !

    J'ai donc 2 conditions : dois-je créer 2 requetes ? ou est-ce que je peux les imbriquer dans une même requête ?
    Voila aprés faudra que je créée un formulaire avec un bouton pour lancer cette requete...!

    J'espere avoir été claire...
    DAns tous les cas, merci de vos réponses.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    J'ai pas tout compris, mais je ne vois pas de lien entre les deux requêtes ... Tout dépend du type de question apparement.

    J'utiliserai un SECECT CASE pour le type de question, et ensuite faire les traitements spécifiques.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Points : 38
    Points
    38
    Par défaut
    Merci de m'avoir répondu...

    Pour l'instant j'ai écrit en SQL le programme suivant :

    Code SQL : 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
    22
    23
    SELECT QUESTIONS.type_question, 
    IIf([type_question]='PROFIL',
         SELECT PROFILS.no_etude, QUESTIONS.no_etude, QUESTIONS.modalite_min, QUESTIONS.modalite_max, PROFILS.note, 
         IIf([modalite_min]=1 And [modalite_max]=9,(([PROFILS.note]-5)*1.25)+5,
         IIf([modalite_min]=1 And [modalite_max]=7,(([PROFILS.note]-4)*1.67)+5,
         IIf([modalite_min]=1 And [modalite_max]=5,(([PROFILS.note]-3)*2.5)+5)))
         AS NOTE_POND
         FROM PROFILS INNER JOIN QUESTIONS ON PROFILS.no_etude = QUESTIONS.no_etude;
    IIf([type_question]='CHOIX ATT',
         SELECT CHOIXATT.no_etude, QUESTIONS.no_etude, QUESTIONS.modalite_min, QUESTIONS.modalite_max, CHOIXATT.reponse, 
         IIf([modalite_min]=1 And [modalite_max]=9,(([CHOIXATT.reponse]-5)*1.25)+5,
         IIf([modalite_min]=1 And [modalite_max]=7,(([CHOIXATT.reponse]-4)*1.67)+5,
         IIf([modalite_min]=1 And [modalite_max]=5,(([CHOIXATT.reponse]-3)*2.5)+5)))
         AS NOTE_POND
         FROM PROFILS INNER JOIN QUESTIONS ON PROFILS.no_etude = QUESTIONS.no_etude;
    IIf([type_question]='CARAC ATT',
         SELECT CARACATT.no_etude, QUESTIONS.no_etude, QUESTIONS.modalite_min, QUESTIONS.modalite_max, CARACATT.reponse, 
         IIf([modalite_min]=1 And [modalite_max]=9,(([CARACATT.reponse]-5)*1.25)+5,
         IIf([modalite_min]=1 And [modalite_max]=7,(([CARACATT.reponse]-4)*1.67)+5,
         IIf([modalite_min]=1 And [modalite_max]=5,(([CARACATT.reponse]-3)*2.5)+5)))
         AS NOTE_POND
         FROM PROFILS INNER JOIN QUESTIONS ON PROFILS.no_etude = QUESTIONS.no_etude;
    FROM QUESTIONS;

    En fait, le type de question importe peu, c'est juste que ça va permettre d'ouvrir la table correspondante pour récupérer la note qu'il faut pondérée.

    Merci

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 419
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 419
    Points : 4 297
    Points
    4 297
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT questions.n°_etude, questions.type_question, tempo.note, questions.modalmin, questions.modalmax
    FROM questions INNER JOIN (SELECT n°_etude,note, "profil" AS type_question FROM profil
    union all
    SELECT n°_etude,note, "choix att" AS type_question FROM [choix att]
    UNION ALL SELECT n°_etude,note, "carac att" AS type_question FROM [carac att]) as tempo
    ON questions.type_question = tempo.type_question;
    serait un début plus simple
    pour la gestion des pondérations j'utiliserais une table annexe ou une fonction qui seront infiniment plus lisibles et faciles à maintenir que du sql
    Elle est pas belle la vie ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2007
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 97
    Points : 38
    Points
    38
    Par défaut
    Encore merci pour vos réponses...

    Pour faire mon calcul de pondération, vous pensez qu'il faut mieux utiliser un programme VBA plutôt que de créer un champs calculé à l'aide d'une requete ?

    Le programme que vous avez fourni permet de créer une nouvelle table (TEMPO), mais pour ce faire, il faut au préalable entrer une note, or, j'ai déjà les notes (dans la table PROFILS si le type_question est profils, dans la table CHOIX ATT si le type_question est choix att ou dans la table CARAC ATT si le type_question est carac att) sur lesquels je dois appliquer ma pondération. Sous Excel, c'est plus simple, il suffirait d'entrer la formule (Exemple : note_pondéré = ((note - 5)*1.5)+5, où note est la variable d'entrée stockée dans l'une ou l'autre des tables décritent précédemment), sauf que j'ai besoin d'automatiser tout ça !

    Voilà, pas simple...

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/08/2011, 16h03
  2. requête sql qui joint deux champs dans une seule chaine
    Par marwacht dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/05/2011, 10h29
  3. [SQL] Conditions dans une requête SQL
    Par NeO666Linux dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 02/07/2007, 22h35
  4. Réponses: 4
    Dernier message: 10/04/2007, 11h10
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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