SAS - Possibilités de la Proc SQL
Transcription
SAS - Possibilités de la Proc SQL
Ou comment multiplier les fonctionnalités de SAS ! 24/02/2012 Aurélien VESIN 1 Introduction • SAS : Datamanagement puissant grâce aux étapes DATA • Mais les étapes data ont des limites : – Agrégation de données par groupe – Stockage d’observation dans des variables MACRO – Rajouter des lignes de données – Fusion de tables • Solution : Utilisation complémentaire du langage SQL 24/02/2012 Aurélien VESIN 2 Syntaxe de base de la proc SQL Début de la procédure PROC SQL; Sélection des variables SELECT var1, var2,… FROM table1,… Sélection de la table de données WHERE condition1 Condition de sélection RUN; Fin de la procédure Le code SQL tel que montré ici est équivalent à la PROC PRINT suivante PROC PRINT DATA=table1; VAR var1 var2 … ; WHERE condition1; RUN; 24/02/2012 Aurélien VESIN, 2012 3 Syntaxe de base de la proc SQL PROC SQL; Le résultat de la requête est stocké dans une table CREATE TABLE res AS SELECT var1, var2,… FROM table1,… WHERE condition1 RUN; Le code SQL tel que montré ici est équivalent à l’étape DATA suivante DATA res;SET table1; KEEP var1 var2 … ; WHERE condition1; RUN; 24/02/2012 Aurélien VESIN, 2012 4 1 – l’option GROUP BY Exemple : On dispose d’une table de données TABLE1 contenant les informations de patients de plusieurs services de réanimation : Une ligne = 1 patient. On souhaite obtenir l’age moyen des patients pour chaque service. On groupe par centre PROC SQL; CREATE TABLE table2 AS SELECT id_centre, MEAN(age) FROM table1 GROUP BY id_centre RUN; Attention : Lorsqu’on utilise GROUP BY, toutes les variables suivant l’option SELECT doivent êtres soit : les variables de regroupement, soit des variables agrégées par des fonctions. Bonus : La table de sortie est triée par la variable de groupement. Cela économise une procédure SORT lors d’une prochaine fusion de table avec MERGE 24/02/2012 Aurélien VESIN, 2012 5 1 – l’option GROUP BY Les fonctions existantes : MEAN( …) MIN(…) MAX(…) SUM(…) COUNT(…) STD(…) Et bien d’autres… Malheureusement certaines fonctions comme la médiane n’éxiste pas ! Il faudra passer par la PROC MEANS et l’option OUTPUT. 24/02/2012 Aurélien VESIN, 2012 6 2 – Stockage de résultats dans les macro variables • Très facile avec la Proc SQL grâce à la fonction INTO: ! * Compte le nombre d’observations dans la table et stock le résultat dans la macro var NB_OBS; PROC SQL; SELECT count(*) INTO: NB_OBS FROM table1 RUN; * Affiche dans la LOG la valeur de NB_OBS %PUT &NB_OBS ; 24/02/2012 Aurélien VESIN, 2012 7 2 – Stockage de résultats dans les macro variables • Et il est possible de stocker plusieurs résultats en précisant le séparateur ! * Stock tous les id_patients dans une macro variable Ids en les séparant par un point-virgule; PROC SQL; SELECT DISTINCT id_patient INTO: IDs SEPARATED BY «;» FROM table1 RUN; * On pourra utiliser ultérieurement cette macro variable dans une boucle de macro pour travailler tour à tour sur chaque patient; 24/02/2012 Aurélien VESIN, 2012 8 3 – Rajouter manuellement des observations dans une table • Pas aisé avec une étape DATA • Avec la Proc SQL : Soit en remplissant les valeurs pour toutes les variables : PROC SQL; INSERT INTO table1 VALUES (1, ‘Jean Claude’, ‘DUSS’,35,’25/12/2003’); Soit en rajoutant les valeurs que pour certaines variables : PROC SQL; INSERT INTO table1 SET id_patient=1, PRENOM=‘Jean Claude’, NOM=‘DUSS’ SET id_patient=2, PRENOM=‘Crèpe’, NOM=‘GIGI’; 24/02/2012 Aurélien VESIN, 2012 9 4 – Fusion horizontale de tables • La fusion « horizontale » de tables avec SAS grâce à la fonction MERGE est simple et performante • Mais elle ne permet pas de faire tous les types de fusions ! SAS gère les fusions : – One-to-one – One-to-many – Mais pas les fusions Many-to-many 24/02/2012 Aurélien VESIN, 2012 10 4 – Fusion horizontaleTABLE de2 tables TABLE 1 ID Test ID patient ID patient Jour Repas 1 Franck Ulysse Lundi Bananes 2 Ulysse Ulysse mardi Raclette 3 Charles Ulysse Mercredi Fondue 4 Kevin Ulysse Jeudi Raclette 5 Yolande Ulysse Vendredi Tartiflette 6 Oriane Ulysse Samedi Spasfon 7 Ulysse Ulysse Dimanche Soupe 8 Kevin Lundi Franck 9 Edwige Franck Mardi Mac Deluxe 10 Norbert Franck mercredi Mac Nuggets Comment faire pour que les jours d’Ulysse (table 2) soient répétés à chaque « ID TEST » de la table 1 (= Fusion MANY-TO-MANY) ? 24/02/2012 Aurélien VESIN, 2012 11 4 – Fusion horizontale de tables PROC SQL; CREATE TABLE table3 AS SELECT * FROM table1, table2 WHERE table1.id_patient= table2.id_patient ; On répète les données de la table 2 pour chaque ligne de la table 1 Jour Repas 1 Franck . . 2 Ulysse Lundi Bananes 2 Ulysse mardi Raclette 2 Ulysse Mercredi Fondue 2 Ulysse Jeudi Raclette 2 Ulysse Vendredi Tartiflette 2 Ulysse Samedi Spasfon 2 Ulysse Dimanche Soupe 7 Ulysse Lundi Bananes 7 Ulysse mardi Raclette 7 Ulysse Mercredi Fondue 7 Ulysse Jeudi Raclette 7 Ulysse Vendredi Tartiflette 7 Ulysse Samedi Spasfon 7 Ulysse Dimanche Soupe … Pour plus de détails sur les fusion de tables avec Proc SQL : http://nesug.org/proceedings/nesug08/ff/ff03.pdf 24/02/2012 ID patient Aurélien VESIN, 2012 12 5 – Connexions au bases de données distantes • PROC SQL permet de se connecter aux bases de données distantes via DBMS • (réalisable avec LIBNAME de SAS aussi) 24/02/2012 Aurélien VESIN, 2012 13 Informations sur SQL • http://www.globalstatements.com/download/ logicsql.pdf • Sur le site de SAS : • http://support.sas.com/documentation/cdl/e n/sqlproc/63043/HTML/default/viewer.htm#n 1oihmdy7om5rmn1aorxui3kxizl.htm 24/02/2012 Aurélien VESIN, 2012 14