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 :

Filtre liste d'arguments complets ou tronqués [SQL]


Sujet :

SAS Base

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 52
    Points
    52
    Par défaut Filtre liste d'arguments complets ou tronqués
    Bonjour,

    Je souhaite créer une requête qui m'extraie d'une table toutes les informations pour lesquelles un champ appartient à une liste prédéterminée. Cette liste pouvant contenir plusieurs enregistrements complets ou tronqués.

    Création de ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DATA liste_facture;
    LENGTH n_facture $11;
    INPUT n_facture $;
    cards;
    201012
    20110101001;
    RUN;
    Dans cet exemple je souhaite récupérer par exemple toutes mes factures de décembre 2010 et ma première facture du 01/01/2011. Sachant que cette liste et une variable de mon programme et pourrait contenir davantage de critères.

    Voici le code pour ma liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DATA liste_facture;
    SET liste_facture;
    if length(compress(N_facture))<11 then
    	N_facture=compress(N_facture||"%") ;
    else
    	N_facture=compress(N_facture);
    RUN;
     
    Proc SQL noprint;
    SELECT Quote(N_facture) INTO : liste_facture separated BY ','
    FROM N_facture;
    quit;
    %put liste_facture = &liste_facture;
    Je souhaite ainsi extraire de maTable tous les champs dont le N_facture commence par les valeurs de ma liste. Il me faudrait un mélange de IN et de LIKE. Pour l'exemple j'ai pris des valeurs numériques mais mon véritable champs peut contenir des caractères alphanmumériques.

    Si jamais vous avez des idées? Par avance merci.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    combien de lignes dans la table "liste_facture" et dans "N_facture" ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 52
    Points
    52
    Par défaut
    La table liste_facture pourra avoir un nombre de lignes variable, disons de 1 à 20. Pour l'instant, je construis cette liste à partir d'une proc data, mais à l'avenir il pourra s'agir d'un fichier texte ou autre. Cette liste sera à terme saisie par l'utilisateur.

    N_Facture est un nom de champ. Il peut y avoir plusieurs lignes par N_Facture dans la table que je souhaite interroger in fine.

    Ma difficulté est que l'utilisateur pourra choisir parmi plusieurs critères de filtre :
    un/plusieurs N_Facture tronqués
    un/plusieurs N_Facture complets
    un/plusieurs N_Facture complets et tronqués

    La table que j'interrogerai ne contient que des N_facture complets

  4. #4
    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 : 46
    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
    Tu pourrais essayer l'opérateur IN: (avec les : ) qui signifie "commence par" et fonctionne comme un IN.
    Ca ne fonctionne pas en SQL, mais dans tous les autres WHERE et IF.
    Bon courage.
    Olivier

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Si tu n'as donc pas trop de lignes tu peux faire un produit cartesien avec un SQL et coder la jointure avec un OR :

    (SI N_Facture complets) or (SI N_Facture tronqués)

    pour coder le tronqué je te conseille la fonction index par exemple.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 61
    Points : 52
    Points
    52
    Par défaut
    Merci à tous les 2 pour vos réponses.

    J'ai tenté la première proposition qui restait dans mes compétences, et ça fonctionne très bien, je ne connaissais pas cet opérateur. Il ne me reste plus qu'à transformer toutes mes PROC SQL en PROC DATA.

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

Discussions similaires

  1. [Débutant] Utiliser des listes en argument d'une fonction
    Par erkenbrand dans le forum Windows Forms
    Réponses: 10
    Dernier message: 29/05/2008, 12h56
  2. liste d'arguments modèle ?
    Par PititeValoche dans le forum C++
    Réponses: 8
    Dernier message: 21/12/2007, 08h25
  3. Réponses: 21
    Dernier message: 21/03/2007, 05h18
  4. Getopt, liste d'argument assignée à une option
    Par gobgob dans le forum Modules
    Réponses: 3
    Dernier message: 19/01/2007, 11h02
  5. Réponses: 4
    Dernier message: 28/11/2006, 09h50

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