Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/10/2011, 14h42   #1
Invité régulier
 
Inscription : juin 2011
Messages : 36
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 36
Points : 8
Points : 8
Par défaut Inclure des conditions dans la création de liens entre deux tables

J'ai une petite table de référence avec des intitulés pour une clé consitutée de deux variables. Par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
DATA sit;
	input v1 v2 libel $15.;
	cards;
	75 1 Paris1erarr
	75 2 Paris2ndarr
	75 3 Paris3earr
	94 . VdM
	93 . SSD
	99 99 Indéterminé
	;
run;
J'ai une autre table bien plus fournie avec une combinaison des deux variables ci-dessus pour différents individus. Par exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DATA sitac;
	input v1 v2 nom $15.;
	cards;
	75 1 Pierre
	75 2 Paul
	75 3 Jacques
	94 1 Marie
	94 2 Laeticia
	94 3 Christophe
	92 1 Philippe
	92 2 Amélie
	92 3 Arnaud
	;
run;
Mon objectif est le suivant : je voudrais pouvoir créer une nouvelle table avec tous les enregistrements de sitac en affichant, pour chaque enregistrement, le libel correspondant à une combinaison v1, v2 lue dans la table sit...

MAIS :

Mon problème est que ce n'est pas un lien direct d'équivalence puisqu'il y a beaucoup plus de possibilités dans la table sitac et que je dois faire une correspondance logique lors du lien selon des règles précises :

- Si la combinaison v1/v2 de l'enregistrement de la table sitac est présente dans la table sit, alors effectuer le lien normalement. Ex. pour les 3 premières lignes de sitac, obtenir de façon logique les résultats suivants :

75 1 Pierre Paris1erarr
75 2 Paul Paris2ndarr
75 3 Jacques Paris3earr

Si seul le v1 (mais pas le v2) de la combinaison v1/v2 de l'enregistrement est présente dans la table sit, alors effectuer le lien uniquement sur le v1. Ex. pour les lignes 4 à 6 de sitac, obtenir les résultats suivants :

94 1 Marie VdM
94 2 Laeticia VdM
94 3 Christophe VdM

- Si v1 n'est pas présent dans la table sit (quel que soit la valeur de v2), alors lier avec le 99/99 de la table sit. Ex. pour les lignes 7 à 9 de sitac, obtenir les résultats suivants :

92 1 Philippe Indéterminé
92 2 Amélie Indéterminé
92 3 Arnaud Indéterminé

J'ai abordé cette question en pensant pouvoir créer la table finale que je souhaite avec un proc sql mais je me suis aperçu que je ne savais pas mettre de condition lors de la création du lien ("where if" ???). Est-ce possible ? Ou avec un merge (que j'utilise très peu...) ?

(Mon problème se complique après dans un second temps mais déjà si j'arrive à régler ce premier soucis je saurais peut-être également coder la seconde partie...)

Merci d'avance
Areis est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 15h19   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
Bonjour.
Ça ressemble beaucoup à un besoin à traiter en SQL. En tout cas beaucoup plus qu'avec un MERGE.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
PROC SQL ;
  CREATE TABLE work.jointure AS
    SELECT d.*,
	       COALESCE(l.libel,"Indéterminé") AS libel
	FROM work.sitac AS d
	  LEFT JOIN
	     work.sit   AS l
	  ON d.v1 = l.v1
	  AND (d.v2 = l.v2
	    OR l.v2 IS MISSING)
  ;
QUIT ;
Tu noteras qu'en fait, le 99/99 n'est pas nécessaire dans ce cas, la fonction COALESCE et le LEFT JOIN se chargent de gérer les cas de non correspondance entre les tables.
Bon courage.
Olivier
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/10/2011, 16h14   #3
Invité régulier
 
Inscription : juin 2011
Messages : 36
Détails du profil
Informations forums :
Inscription : juin 2011
Messages : 36
Points : 8
Points : 8
Impeccable, merci Olivier.

Je suis en train de regarder un peu en détail comment fonctionne le COALESCE pour pouvoir l'adapter à mon problème initial - simplifié dans le fuseau que j'ai posté ici.

(Je mets le fuseau comme résolu mais au besoin je reviens ici si je bloque encore pour la suite ! )
Areis est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h43.


 
 
 
 
Partenaires

Hébergement Web