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

SAS Base Discussion :

LEFT JOIN sur un champs de longueur variables [SQL]


Sujet :

SAS Base

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut LEFT JOIN sur un champs de longueur variables
    Bonjour,
    la réponse doit surement être toute bete mais je débute SAS.
    J'ai 2 tables ayant un champ "code_produit", je souhaite faire une requete
    avec une jointure type LEFT JOIN, mais dans un cas ce code est sur 4 caractères et dans l'autre 6 (les 00 inutiles en début de chaine ont été supprimés et je ne maitrise pas le format d'import) :

    exemple :
    table 1
    code_produit : 1956

    table 2
    code_produit : 001956

    J'ai essayé ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    from baseh.SCorres as corres
    left join htdwh.codes_samse_import as codes_import
    ON ( case when length(corres.SCode)=5 then compress("0"!!corres.SCode)=put(codes_import.code_samse,BEST6.) 
    else when length(corres.Scode)=4 then compress("00"!!corres.SCode)=put(codes_import.code_samse,BEST6.) 
    else when length(corres.Scode)=6 then corres.SCode=put(codes_import.code_samse,BEST6.) 
    end
    );
    mais j'ai une erreur :

    Code : 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
    1881           /* case when compress(sections.profil)ne '' then
    1881! compress(vol.profil)=compress(sections.profil) else 1=1 end  */
    1882           ON ( case when length(corres.SCode)=5 then
    1882! compress("0"!!corres.SCode)=put(codes_import.code_samse,BEST6.)
    1883                     else when length(corres.Scode)=4 then
                                       ------
                                       22
                                       76
    1883! compress("00"!!corres.SCode)=put(codes_import.code_samse,BEST6.)
    ERREUR 22-322: Erreur de syntaxe ; syntaxe requise : !, !!, &, (, *, **, +, -, /, <, <=, <>, =, >, >=,
                   ?, AND, BETWEEN, CONTAINS, EQ, EQT, GE, GET, GT, GTT, LE, LET, LIKE, LT, LTT, NE, NET,
                   OR, ^=, |, ||, ~=.
     
    ERREUR 76-322: Erreur de syntaxe ; l'instruction sera ignorée.
     
    1884                     else when length(corres.Scode)=6 then
    1884! corres.SCode=put(codes_import.code_samse,BEST6.)
    1885                end
    1886              );
    1887  quit;
    Je suis sur que vous allez me blaser tellement ça doit être simple mais je tourne en rond depuis un moment sur ce soucis.

    Merci de votre aide.

  2. #2
    Expert confirmé
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    Avril 2008
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 064
    Points : 4 478
    Points
    4 478
    Par défaut
    Bonjour.
    Dans CASE WHEN, chaque WHEN exclut automatiquement les précédents. Pas besoin de ELSE WHEN, juste WHEN. Il y a par contre, éventuellement, un ELSE final.
    Une solution autre (est-elle plus simple ? ça dépend de la logique de chacun) est de convertir tous ces codes en nombres, avec INPUT(scode,6.) qui devrait donner la bonne valeur quel que soit le nombre de zéros liminaires.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 30
    Points : 30
    Points
    30
    Par défaut
    Merci Olivier, parfois on cherche compliqué au lieu de faire simple...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    from baseh.SCorres as corres
    		 left join htdwh.codes_samse_import as codes_import ON ( input(corres.SCode,6.)=codes_import.code_samse );
    problème résolu.

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

Discussions similaires

  1. [AC-2010] left join sur concaténation de 3 champs possible ?
    Par Nikimizi dans le forum Access
    Réponses: 0
    Dernier message: 01/08/2014, 12h02
  2. [MySQL] 2 LEFT JOIN sur même table
    Par bupocirk dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/07/2007, 16h53
  3. LEFT JOIN sur 2 BDD
    Par padawa dans le forum Outils
    Réponses: 1
    Dernier message: 07/04/2007, 13h40
  4. [champ TEXT]longueure variable ou pre-definie?
    Par hansaplast dans le forum Administration
    Réponses: 2
    Dernier message: 08/08/2006, 17h04
  5. LEFT JOIN sur sous requete
    Par passie dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/06/2006, 12h51

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