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 :

cas d'école : Requête combinée avec test sur une colonne


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut cas d'école : Requête combinée avec test sur une colonne
    Bonjour,
    J'ai un champ dans une colonne A qui contient 6 caractères, les deux premiers caractère de la colonne servent de référence.
    Besoin : Mis à jour de la colonne B en fonction de la colonne A en fonction des critères ci-dessous :
    -1) Si la valeur d'une ligne de la colonne A se termine par 0000 je met 1 dans la colonne B
    -2) Si la valeur d'une ligne de la colonne A se termine par 000 je met 2 dans la colonne B
    -3) Si la valeur d'une ligne de la colonne A se termine par 00 je met 3 dans la colonne B
    -4) Cas particulier : Si pour une valeur de la colonne A il n'existe pas de valeurs avec cas dans B à 2 je met 3 à la place de 2
    Exemple de résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneB
    210000 1
    213000 3
    220000 1
    223000 2
    223100 3
    380000 1
    383000 2
    383100 3
    290000 1
    293000 3
    J'ai la requête pour les 3 premiers cas, il me manque le cas particulier avec le test du cas 4). Merci de votre aide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE Datamart INNER JOIN FileInput_IMSPA_ZCIM11 ON Datamart.SAPIdentification_IONumber_=FileInput_IMSPA_ZCIM11.IONumber_ SET Datamart.AMDSLevel_ = IIF(RIGHT(FileInput_IMSPA_ZCIM11.IOChapter_,4)='0000',1,IIF(RIGHT(FileInput_IMSPA_ZCIM11.IOChapter_,3)='000',2,IIF(RIGHT(FileInput_IMSPA_ZCIM11.IOChapter_,2)='00',3,NULL)))
    WHERE Datamart.Identification_PMPB_= 'DS-01';

  2. #2
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour teuzadur,

    Que veux-tu dire par :
    Citation Envoyé par teuzadur Voir le message
    -4) Cas particulier : Si pour une valeur de la colonne A il n'existe pas de valeurs avec cas dans B à 2 je met 3 à la place de 2
    En regardant ton exemple :
    Citation Envoyé par teuzadur Voir le message
    Exemple de résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneB
    210000 1
    213000 3
    220000 1
    223000 2
    223100 3
    380000 1
    383000 2
    383100 3
    290000 1
    293000 3
    je n'ai pas compris la règle de gestion pour les valeurs 213000 et 293000.
    Est-ce que cela signifie "Si la valeur d'une ligne de la colonne A se termine par 000 et qu'il y a 3 en 3ème position je met 3 dans la colonne B" ?
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    C'est un cas un peu particulier pour lequel il n'existe pas de valeur dans la colonne A ou B est à 3. Donc s'il existe un cas dans la colonne A ou B est à 2 on met directement 3.

    Algo :
    Au départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ColonneA ColonneB
    210000
    213000
    Pour 210000 se termine par '0000' on met 1 dans B
    Pour 213000 se termine par '000' on met 2 dans B, comme il n'existe pas de cas 213X00 (où X différent de 0) dans la colonne A on met directement 3 dans B. J'espère que c'est plus clair. Parfois par la parole c'est bcp plus simple que par l'écrit.

  4. #4
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Désolé, ce n'est pas beaucoup plus clair pour moi !

    quelle est la règle de gestion qui te dit ?
    comme il n'existe pas de cas 213X00 (où X différent de 0) dans la colonne A
    Car dans ton exemple, il y a bien la valeur 213000 dans la colonne A !

    il faudrait alors faire un traitement en 2 temps :
    1) identifier les valeurs "impossibles" et y mettre un flag OK / NOK
    2) tester ensuite en fonction du nombre de 0 à droite et du flag
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Mince, pourtant en soit c'est super simple. Ma requête dans un post précédent répond presque au problème sauf qu'il me manque le traitement du cas 4)

    La réponse à ta question <quelle est la règle de gestion qui te dit ?>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ColonneA ColonneB
    210000 1
    213000 3
    Pour faire simple il existe 4 tests : 1) 2) 3) 4)
    Les critères 1) 2) existent, comme 3) absent on applique le cas 4) soit mettre la valeur 3 à la place de la valeur 2 dans la colonne B.

    4) Cas particulier : Si pour une valeur de la colonne A il n'existe pas de critères correspondant à 3) dans B je met 3 à la place de 2.

  6. #6
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Je n'ai pas du avoir le déclic, car quand je vois 213000 dans A, je devrais bien mettre 2 dans B.
    Alors que dans ton cas, pour la valeur 213000 tu voudrait mettre 3 dans B.

    Quelle est donc la règle de gestion qui permet de différencier 223000 (-> b=2) de 213000 (-> b=3) ?
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    On s'approche car tu as tout dit :
    car quand je vois 213000 dans A, je devrais bien mettre 2 dans B.
    ->Oui

    Alors que dans ton cas, pour la valeur 213000 tu voudrait mettre 3 dans B.
    ->Oui. Règle de gestion : il n'existe pas de cas 3) pour cet exemple donc je force la valeur 3 à la place de la valeur 2 dans B.

    Quelle est donc la règle de gestion qui permet de différencier 223000 (-> b=2) de 213000 (-> b=3) ?
    Réponse au-dessus. Dans le premier exemple j'ai un regroupement de deux lignes, par contre dans le deuxième exemple j'ai un regroupement de trois lignes. Dans le deuxième exemple j'ai un cas 3) alors que dans le premier NON.
    C'est plus clair?

  8. #8
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    Bonjour Teuzadur,

    Non, ce n'est pas plus clair, car tu es en train de nous communiquer les informations au compte-goutte.
    tu nous dis :
    Dans le premier exemple j'ai un regroupement de deux lignes, par contre dans le deuxième exemple j'ai un regroupement de trois lignes
    C'est une information que nous n'avions pas auparavant.

    Maintenant, je m'aperçois de mon côté que je n'avais pas intégré que :
    dans une colonne A qui contient 6 caractères, les deux premiers caractère de la colonne servent de référence.
    Est-ce que le 3ème caractère est calculé en fonction d'une règle de gestion particulière ? En effet, tu ne nous précise pas comment savoir si la c'est un regroupement de 2, 3 lignes ou plus ...
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Tout est dans les posts précédents, je ne peux pas être plus clair malheureusement. Sans être indélicat j'ai l'impression que tu ne lis pas correctement les posts.

  10. #10
    Membre éclairé Avatar de dumas.blr
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2010
    Messages
    598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2010
    Messages : 598
    Points : 879
    Points
    879
    Par défaut
    alors, je ne peux rien pour toi malheureusement; je dois avoir atteint mes limites de compréhension.
    S'il n'y a pas de solution, c'est qu'il n'y a pas de problème !!!
    si tout est OK, n'oubliez pas de cliquer sur

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Je suis preneur de toute aide si quelqu'un peut m'aider. Si vous avez des questions ou si je ne suis pas clair dites moi si je peux aider à la compréhension.

  12. #12
    Expert confirmé Avatar de Richard_35
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3 121
    Points : 4 596
    Points
    4 596
    Par défaut
    Bonjour Teuzadur et Dumas.blr,

    Citation Envoyé par Teuzadur
    Sans être indélicat j'ai l'impression que tu ne lis pas correctement les posts.
    ==> mais, tu l'es quelque peu, concernant un bénévole qui a, de surcroît, l'habitude d'aider les visiteurs avec brio.


    Ta demande est une (mini) usine à gaz, et je me demande s'il n'y a pas quelque chose à faire en amont. Mais bon... analysons ton besoin initial.

    A mon avis, il faut passer par plusieurs étapes, avec des tables temporaires. Donc, à partir de ton exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneB
    210000   1
    213000   3
    220000   1
    223000   2
    223100   3
    380000   1
    383000   2
    383100   3
    290000   1
    293000   3
    en triant par ColonneB, nous obtenons :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneB
    210000   1
    220000   1
    290000   1
    380000   1
    223000   2
    383000   2
    213000   3
    223100   3
    293000   3
    383100   3
    *****
    Il me semble comprendre que la seule raison pour laquelle ont ColonneB=3 est que 213 et 293 n'existe pas.
    *****
    A contrario, la raison pour laquelleont ColonneB=2 est que 223x et 383x existe.
    *****

    Si, jusque là, tout est juste... suggestion :
    Requête R1 qui sépare les premiers chiffres<> 0 des chiffres=0, qui donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneA_1
    21	 0000
    22	 0000
    29	 0000
    38	 0000
    223	 000
    383	 000
    213	 000
    2231	 00
    293	 000
    3831	 00
    Requête R2 qui affecte ColonneB sans exception, qui donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneA_1 ColonneB
    21	 0000	    1
    22	 0000	    1
    29	 0000	    1
    38	 0000	    1
    223	 000	    2
    383	 000	    2
    213	 000	    2
    2231	 00	    3
    293	 000	    2
    3831	 00	    3
    Requête R3 qui gère les exceptions, ne traitant que ColonneB=2 et cherchant la non-correspondance. Ce qui donnera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ColonneA ColonneA_1 ColonneB
    21	 0000	    1
    22	 0000	    1
    29	 0000	    1
    38	 0000	    1
    223	 000	    2 
    383	 000	    2
    213	 000	    3
    2231	 00	    3
    293	 000	    3
    3831	 00	    3
    Je ne te détaille pas les requêtes (qui seront à travailler), mais je pense que tu voies l'esprit.

    En règle générale, la tendance à vouloir tout régler en une seule requête est souvent dommageable : le découpage du travail en sous-tâches est souvent plus efficace.
    Dis-nous et à bientôt,
    Richard.
    ----------------------------------------------------------------------------------------------
    En cas de résolution, et afin de faciliter la tâche des bénévoles, merci de cliquer sur .
    et permettent aux forumeurs de cibler leur recherche dans une discussion : n'hésitez pas à voter !

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 51
    Points : 33
    Points
    33
    Par défaut
    Bonjour,
    J'ai trouvé une solution à mon problème directement dans le code vb.net en passant par plusieurs requêtes. Richard ta réponse ne correspond pas à mon besoin, c'est beaucoup plus simple, désolé pour le manque de clarté dans mes explications. Merci de votre aide.
    Cordialement,

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

Discussions similaires

  1. Requête sql avec test d'une variable
    Par missmiss89 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 30/06/2011, 10h42
  2. [MySQL] Requête sql avec test d'une variable très longue
    Par missmiss89 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 24/06/2011, 14h25
  3. Requête pivot avec création d'une colonne "total"
    Par minijim dans le forum Langage SQL
    Réponses: 7
    Dernier message: 10/11/2010, 21h09
  4. [XL-2003] Macro avec boucle sur une colonne et condition sur une autre
    Par Isabelle86 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/10/2010, 10h31
  5. Création tag avec test sur une proprièté d'un bean
    Par Didine981 dans le forum Struts 1
    Réponses: 1
    Dernier message: 04/06/2009, 22h08

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