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