Sunteți pe pagina 1din 36

Contents

II.9. Subseturi şi conbinarea seturilor de date SAS 161..............................................................1


II.9.1. Partajarea unui set de date SAS....................................................................................1
II.9.2. Crearea mai multor subset-uri de date SAS într-un singur DATA Step.......................2
II.9.3. Combinarea de tabele SAS...........................................................................................3
II.9.3.1. Conbinarea Unu la Unu..................................................................................3
II.9.3.2. Concatenarea..................................................................................................4
II.9.3.3. Intercalarea seturilor de date..........................................................................6
II.9.2.4. Inbinarea a două seturi de date.......................................................................8
II.10. Proceduri specifice SQL..................................................................................................13
II.10.1. Joncţiunea a două tabele (Merge).............................................................................14
II.10.1. Concatenarea seturilor de date..................................................................................18
II.10.3. Utilizarea funcţiilor Summary în PROC SQL..........................................................20
II.10.4. Corespondenţe neclare..............................................................................................20
II.11. Prelucrarea variabilelor cu ajutorul masivelor.................................................................21
II.12.1. Inlocuirea valorilor într-un set de date SAS..............................................................22
II.12.2. Utilizarea unei matrici pentru a crea noi variabile....................................................23
II.12. Realizarea de rapoarte agregate şi de detaliu...................................................................23
II.10.1. Afişarea datelor.........................................................................................................23
II.10.2. Crearea rapoartelor personalizate..............................................................................29

II.9. Subseturi şi conbinarea seturilor de date SAS 161


II.9.1. Partajarea unui set de date SAS

Partajarea unui set de date SAS implică selectarea observațiilor dintr-un set de date prin
definirea criteriilor de selecție, de obicei într-o instrucțiune WHERE sau IF.

De exemplu, să presupunem că se doreşte selectarea tuturor observațiilor din setul de date SAS
permanent sondaj aflat în biblioteca exemple, unde valoarea variabilei gen este F. O modalitate
de a face acest lucru este cu o instrucțiune WHERE, după cum urmează:
DATA femei;
SET exemple.sondaj;
WHERE gen = 'F';
RUN;

Amintiți-vă că variabilele utilizate într-o instrucțiune WHERE trebuie să provină dintr-un fişier
de date SAS. Variabilele care sunt create prin citirea datelor brute sau dintr-o instrucțiune de

1
atribuire nu pot fi utilizate în acest mod. În programul de mai sus, setul de date femei conține
toate observațiile din fişierul de date Sondaj în care Gen are valoarea F.
Iată o listă a acestui set de date:
Listing of FEMEI
ID Gen Varsta Salariu Intreb1 Intreb 2 Intreb 3 Intreb 4 Intreb 5
002 F 55 76123 4 5 2 1 1
004 F 67 128000 5 3 2 2 4
007 F 45 76100 5 3 4 3 3

Observați că setul de date Femei conține toate variabilele găsite în setul de date Sondaj.

Dacă nu aveți nevoie de una sau mai multe variabile din setul de date de intrare (setul de date
din instrucțiunea SET), puteți utiliza o opțiune DROP = sau KEEP = set de date.

De exemplu, pentru a omite SALARIU din noul set de date, puteți utiliza următoarea metodă:
data femei;
set exemple.sondaj (drop=Salariu);
where gen = 'F';
run;

II.9.2. Crearea mai multor subset-uri de date SAS într-un singur DATA Step

Dintr-un set de date de intrare se pot crea mai multe subseturi de date SAS (SQL nu face).

După exemplul anterior, puteți crea un set de date care conține numai date despre femei și unul
care conține numai date despre bărbați, într-un singur pas astfel:

DATA barbati femei;


SET exemple.sondaj;
IF gen = 'F' THEN OUTPUT femei;
ELSE if gen = 'M' THEN OUTPUT barbati;
RUN;
Observați că trebuie să denumiți setul de date după instrucțiunea OUTPUT. Dacă nu, SAS
transmite observația către toate seturile de date listate în instrucțiunea DATA.

2
II.9.3. Combinarea de tabele SAS
II.9.3.1. Conbinarea Unu la Unu

Se face prin mai multe instructiuni set cu care se pot citi mai multe tabele diferite sau acelasi
tabel de mai multe ori;
Forma generala este:

DATA tabela-rez;
SET tabela-1;
SET tabela-2;
RUN;
unde:
 tabela-rez este numele tabelului nou creat;
 tabela-1 şi tabela-2 sunt tabelele sursă care se vor combina;
 Noul tabel va contine toate variabilele din toate tabelele specificate prin instrucţiunea
SET.
 Observatiile sunt combinate pe baza pozitiilor lor relative din fiecare tablă - prima
observatie este cuplata cu prima observatie din al doilea tabel, s.a.m.d.; pasul DATA
se opreste cand intalneste primul sfarsit de tabel – deci cand se termina cel mai mic dintre
tabele.
 Daca tabelele sursa au variabile cu acelasi nume, variabila din ultimul tabel va
supra-scrie toate informatiile citite din tabelele anterioare.
 Numarul de observatii din tabelul nou creat este egal cu numarul cel mai mic de
observatii din tabelele sursa.

Exemplu: Fie tabelele SAS A şi B:

Tabela A Tabela B
CodPro Denumir CodProd Cantitate
d e
1 P1 2 100
3 P2 4 20
5 P3

Programul
data one2one;
set A;
set B;
run;

Tabela rezultată va fi

3
CodPro Denumire Cantitate
d
2 P1 100
4 P2 20

II.9.3.2. Concatenarea
Concatenarea:
 tabelele sunt asezate unul după altul;
 noul tabel va contine toate variabilele din toate tabelele concatenate.

Forma generală:
DATA concat;
SET A B;
RUN;

Într-o instrucțiune SET se pot specifica mai multe seturi de date și SAS va adăuga toate
observațiile împreună pentru a forma un singur set de date.

Să presupunem că doriți să creați un singur set de date din mai multe seturi de date similare. De
exemplu, compania dvs. poate colecta date în fiecare lună în seturi de date separate și doriți să
analizați date pe o perioasă de un an.

Exemplu 1: Ambele tabele au aceiaşi structura (aceleaşi coloane)

Tabela-1
N Id Nume Greutate
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80

Tabela-2
Nr Id Nume Greutate
1 9 Adam 120
2 3 Avram 65
3 5 Ion 95

Fiecare set de date conține aceleași variabile.


Lungimea de stocare pentru Nume este aceeași în fiecare dintre cele două seturi de date.

4
O modalitate de a combina aceste seturi de date este următoarea:
data tabela-rez 1-2;
set A B;
run;

Tabela rezultat va fi:


N Id Nume Greutate
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80
5 9 Adam 120
6 3 Avram 65
7 5 Ion 95

Toate observațiile din setul de date Tabela-1sunt urmate de toate observațiile din setul de date
Tabela-2. SAS se referă la acest proces ca seturi de date concatenate.

Exemplu 2: Tabele nu au aceiaşi structura (aceleaşi variabile)


Tabela1
N Id Nume Greutate
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80

Tabela3
N Id Gen Nume
r
1 10 M Popescu
2 15 F Ionescu
3 20 M Pop

Setul de date tabela3 conține o nouă variabilă, Gen și nu conține variabila Greutate. Numele
variabilei Nume din ambele seturi de date are aceeași lungime.

Să folosim instrucțiunea SET pe seturile de date Tabela1 și Tabela3 și să vedem ce se întâmplă.

DATA Tabela_rez_1_3;
SET Tabela1 Tabela3

5
RUN;

Rezultatul este
Tabela-1
N Id Nume Greutate Gen
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80
5 10 Popescu M
6 15 Ionescu F
7 20 Pop M

În zona buffer se aduc variabilele (cu atributele lor) din Tabela1 (Id, Nume, Greutate).
Se verifică structută Tabela3
Dacă există alte variabile faţă de cele din Tabela1(Gen) se completează cu ele zona buffer.
Se iniţializează toate variabilele cu valori lipsă.
Toate observaţiile din Tabela1 sunt citite și scrise în Tabela_rez_1_3.
Se iniţializează variabilele aferente Tabela3 cu valori lipsă.
Toate observaţiile din Tabela3 sunt citite și scrise în Tabela_rez_1_3.

Dacă lungimea unei variabile este diferită în oricare dintre seturile de date de intrare,
lungimea variabilei din setul de date de ieșire este egală cu lungimea pe care o are variabila
din primul set de date întâlnit în etapa DATA.

Este o idee bună să verificați lungimile variabilelor de caractere atunci când combinați mai multe
seturi de date pentru a vă asigura că nu veți trunchia nici o valoare. Dacă este necesar, plasați o
instrucțiune LENGTH înainte de instrucțiunea SET pentru a vă asigura că lungimea rezultată
este adecvată pentru a vă ține toate valorile.

Rețineți că lungimea unei variabile de caractere este determinată de îndată ce acea variabilă intră
în PDV; acesta nu poate fi schimbat după aceea.

În cele din urmă, dacă aveți o variabilă în două seturi de date, un caracter și altul numeric, SAS
imprimă un mesaj de eroare în jurnal și programul se termină.

II.9.3.3. Intercalarea seturilor de date

6
Dacă fiecare dintre seturile de date care urmează să fie combinate este deja sortat, pentru
intercalarea lor se poate utiliza instrucțiunea SET cu o instrucțiune BY.

SAS selectează observațiile din fiecare set de date de intrare în ordine, iar setul de date rezultat
este deja sortat.

Forma generala este:


DATA tabela_rez;
SET Tabela1 Tabela2;
BY variabla(le);
RUN;

Unde variabla(le) indica variabilele dupa care se va face intercalarea.


 Toate tabelele din lista SET trebuie sa fie ordonate dupa variabilele din lista BY
 Fiecare dintre seturile de date din instrucțiunea SET trebuie să fie în ordinea variabilei
BY.
Pentru a demonstra intercalarea seturilor de date, să combinăm seturile de date Tabela1 și
Tabela2 în setul de date Tabela_rez în ordinea ID.
Tabela-1
N Id Nume Greutate
r
1 7 Popescu 75
2 1 Ionescu 90
3 2 Pop 100
4 4 Vasile 80

Tabela-2
Nr Id Nume Greutate
1 9 Adam 120
2 3 Avram 65
3 5 Ion 95

Programul următor va genera tabela-rez


PROC SORT DATA= Tabela1;
by Id;
RUN;

PROC SORT DATA= Tabela2;


BY ID;
run;

7
DATA tabela_rez;
SET Tabela1 Tabela2;
BY Id;
RUN;

Tabela-rez
Id Nume Greutate
1 Ionescu 90
2 Pop 100
3 Avram 65
4 Vasile 80
5 Ion 95
7 Popesc 75
u
9 Adam 120

Exemplu 2:
DATA vanzari;
SET vanzari1999 vanzari2000;
BY luna;
RUN;

II.9.2.4. Interclasarea a două seturi de date

SAS utilizează termenul interclasare pentru a descrie procesul de combinare a variabilelor


(coloanelor) din două sau mai multe seturi de date.

De exemplu, ați putea avea un set de date angajat (Angajat) care să conțină numărul de
identificare și numele şi un alt set de date (Ore) care conține numărul de identificare, împreună
cu departamentul în care lucrează și numărul de ore lucrate, este posibil să se dorească să se
adauge numele angajatului (din setul de date Angajat) la fiecare observație din setul de date Ore.

Tabela Angajat Tabela Ore


I Nume Id Departament Ore
d
1 Popescu 1 Contabilitate 39
2 Ionescu 4 Productie 44
4 Grigorescu 5 Contabilitate 36

8
5 Avram 9 Productie 57
7 Vasile

Forma generala:
DATA tabela_rez;
MERGE Tabela1 Tabela2;
BY <DESCENDING> variabila(le);
RUN;
unde:
 Tabela_rez denumeste tabelul nou creat de pasul data;
 Tabela1 şi Tabela2 - tabelele SAS din care se citesc datele;
 variabila(le) in instrucţiunea BY specifica una sau mai multe variabile dupa care se unesc
observatiile
 <DESCENDING> indica faptul ca datele sursa sunt ordonate in ordine descrescatoare dupa
variabila care urmeaza; daca in lista BY sunt mai multe variabile, <descending> are efect
doar asupra variabilei care urmeaza imediat dupa ea.
 Tabelele din instructiunea BY trebuie sa fie sortate inainte de executarea pasului DATA;
 variabilele din BY trebuie sa aiba acelasi tip in toate tabelele unite de instructiunea MERGE;
 descending nu se poate folosi cu tabele indexate pentru ca acestea sunt intotdeauna ordonate
crescator.

Programul care va realiza intercalarea este:

PROC SORT DATA=angajat;


BY Id;
RUN;

PROC SORT DATA=ore;


BY Id;
RUN;

DATA tabela-rez;
MERGE angajat ore;
BY Id;
RUN;

În primul rând se sortează fiecare tabelă de intrare în funcţie de variabila sau variabilele care
leagă cele două seturi de date. Apoi, în instrucţiunea MERGE se indică numele fabelelor sortate,
urmând instrucțiunea BY prin care se indică denumirea variabilei sau a variabilelor care indică
SAS care observații trebuie plasate în aceeași observație.

Tabela-rez
Id Nume Departament Ore
1 Popescu Contabilitate 39
2 Ionescu

9
4 Grigoresc Productie 44
u
5 Avram Contabilitate 35
7 Vasile
9 Productie 57

In tabelul rezultat vor aparea toate observatiile din toate tabelele sursa.
Daca unul din tabelele de intrare nu contine observatii pentru o anumita valoare a variabilei BY
in tabelul rezultat acestea se completeaza cu valoarea nulă MISSING

Dacă s-ar omite instrucțiunea BY, primele trei observații din setul de date Angajat ar fi corelate
cu primele trei observații din setul de ore Ore. Rezultatul ar fi complet greșit.

S-ar putea să se dorească ca setul de date fuzionat să conțină numai acei angajați care se află în
setul de date Ore sau să se verifice dacă angajații din setul de date Ore nu se regăsesc în setul de
date despre angajați. În acest scop se utilizează opţiunea IN =
DATA nou;
MERGE angajat(in=InAngajat)
ore (in=InOre);
BY Id;
FILE PRINT;
PUT ID= InAngajat = InOre = Nume= Departament= Ore=;
RUN;

O opțiune IN = set de date urmează după fiecare nume de set de date. După cuvântul cheie IN =
este un nume de variabilă pe care îl creați.

În acest exemplu, au fost alese numele InAngajat și InOre. Aceste două variabile sunt variabile
temporare (SAS nu le va adăuga la setul de date de ieșire). Ele au o valoare de 1 (adevărat) în
cazul în care setul de date la care se referă aduce o contribuție la observația curentă și 0 (fals)
altfel. Deoarece aceste variabile nu sunt în setul de date de ieșire, programul anterior utilizează o
instrucțiune PUT pentru a lista valorile acestor variabile, împreună cu alte variabile din setul de
date. Rrezultatul este:
ID=1 InAngajat =1 InOre =1 Nume=Popescu Departament= Contabilitate Ore=39
ID=2 InAngajat =1 InOre =0 Nume = Ionescu Departament = Ore =
ID=4 InAngajat =1 InOre =1 Nume = Grigorescu Departament = Productie Ore =44
ID=5 InAngajat =1 InOre =1 Nume = Avram Departament = Contabilitate Ore =35
ID=7 InAngajat =1 InOre =0 Nume = Vasile Departament = Ore =.
ID=9 InAngajat =0 InOre =1 Nume = Departament = Productie Ore =57

10
Puteți utiliza variabilele IN = pentru a controla care observații sunt scrise în setul de date de
ieșire. De exemplu, dacă doriți numai acei angajați care se află în ambele seturi de date, puteți
adăuga o instrucțiune IF la pasul DATA, după cum urmează:

DATA combine;
MERGE Angajat(IN= InAngajat)
ore(IN= InOre);
BY ID;
IF InAngajat AND InOre;
RUN;
sau if InEmploy = 1 and InHours = 1;
Interclasarea a două seturi de date care au nume de variabile diferite în instrucţiunea BY -
în acest caz se va utiliza opțiune RENAME =

De exemplu pentru tabelele


Tabela Angajat Tabela Ore
I Nume IdPers Departamen Ore
d t
1 Popescu 1 Contabilitat 39
e
2 Ionescu 4 Productie 44
4 Grigorescu 5 Contabilitat 36
e
5 Avram 9 Productie 57
7 Vasile

Se poate folosi
DATA tabela_rez;
MERGE Angajat Ore (RENAME=(IdPers = Id));
BY Id;
RUN;
Interclasarea unu-la-unu, unu-la mai multi
În exemplele de îmbinare prezentate anterior, în ambele seturi de date, a existat o singură
observație pentru fiecare valoare a variabilei BY. Aceasta se numește interclasare unu-la-unu.

Este posibil ca un set de date să aibă o singură observație pentru fiecare valoare a variabilei BY,
dar celălalt set de date să aibă mai multe observații pentru fiecare valoare a variabilei BY.
Aceasta este denumită interclasare unu-la-multe.

11
De exemplu, tabelele următoare:
Tabela Produse Tabela Vanzari
Cod Denumire Cod Cantitate
123 Masa 123 200
222 Scaun 123 250
333 Canapea 222 205
333 317
333 400
333 500

După execuţia codului


DATA table_rez;
MERGE Produse Vanzari;
BY Id;
RUN;
se obţine tabela rezultat:
Tabela_rez

Obs Cod Denumire Cantitate


1 123 Masa 200
2 123 Masa 250
3 222 Scaun 205
4 333 Canapea 317
5 333 Canapea 400
6 333 Canapea 500

Dacă aveți două seturi de date care au câteva variabile comune și efectuați o interclasare de
seturi de date, valorile din cel de-al doilea set de date înlocuiesc valorile din primul set de
date, chiar dacă valorile din al doilea set de date sunt lipsite de valori.

Dacă folosiți o instrucțiune UPDATE, valorile lipsă din al doilea set de date nu înlocuiesc
valorile din primul set de date. Aceasta face ca declarația UPDATE să fie perfectă pentru
actualizarea valorilor într-un set de date de bază din noile valori dintr-un set de date de
tranzacție.

De exemplu există tabelel Preturi şi Preţuri_actualizate

12
Preturi Preţuri_actualizate

Co Denumire Pret Cod Denumire Pret


d
123 Masa 200 123 Masa
222 Scaun 250 222 Scaun 300
333 Canapea 205 333 Canapea

Codul care va realiza actualizarea este


PROC SORT DATA=preturi;
BY Cod;
RUN;

PROC SORT DATA= Preţuri-actualizate;


BY Cod;
RUN;

DATA Preturi_15dec2005;
UPDATE Preturi Preţuri_actualizate;
BY Cod;
RUN;

II.10. Proceduri specifice SQL


PROC SQL oferă o alternativă la pasul DATA pentru interogarea și combinarea seturilor de date
SAS.
Există două modalităţi de bază prin care se poate utiliza SQL împreună cu SAS:
- încorporarea de instrucţiuni SQL complete în procedura SQL;
- încorporarea declaraţiei WHERE pentru a selecta rânduri în secţiunile de date şi
proceduri SAS.
Ambele variante sunt disponibile cu Base SAS şi nu necesită software adiţional
Sintaxa:
PROC SQL;
comandă _sql;
QUIT;
comandă_sql poate fi orice comandă de tipul ALTER, CREATE, DELETE, DESCRIBE,
DROP, INSERT, SELECT sau UPDATE având la sfârşit seminul “;”.

13
Pot fi definite oricâte comenzi SQL într-o procedură SQL. Este o bună practică să se plaseze
QUIT la finalul declaraţiei, nefiind însă obligatoriu.
De exemplu programul de mai jos crează un query prin intermediul instrucţiunii SELECT:
PROC SQL;
SELECT Id,
Inaltime,
Greutate
FROM exemple.date
WHERE Greutate GT 66;
QUIT;

 Variabilele din listă sunt separate prin virgule (spațiile nu funcționează).


 Cuvântul cheie FROM numește setul de date care va fi citit.
 Clauza WHERE descrie subgrupul dorit.
 SELECT, FROM și WHERE formează o singură interogare, care se termină cu ;.
 În acest exemplu, nu se crează un set de date de ie șire, astfel că, în mod implicit, rezultatul
acestei interogări este trimis ca o listă în fereastra de ieșire (sau în orice locație de ieșire
specificată).
 Interogarea se încheie cu o instrucțiune QUIT. Nu este nevoie de o instrucțiune RUN
deoarece PROC SQL se execută de îndată ce a fost specificată o interogare completă.
 Dacă nu se include o instrucțiune QUIT, PROC SQL rămâne în memorie pentru o altă
interogare.

Dacă doriți să selectați toate variabilele dintr-un set de date, puteți utiliza un asterisc (*)
PROC SQL;
SELECT *
FROM exemple.date
WHERE Greutate GT 66;
QUIT;

Dacă doriți ca rezultatul interogării să fie stocat într-un set de date SAS, includeți un cuvânt
cheie CREATE
PROC SQL;
CREATE TABLE tabela1 AS
SELECT *
FROM exemple.date
WHERE Greutate GT 66;
QUIT;

14
II.10.1. Joncţiunea a două tabele (Merge)

Se pot selecta variabile din două tabele listând toate variabilele de interes în clauza SELECT
și enumerând cele două seturi de date din clauza FROM.

Dacă o variabilă are același nume în ambele seturi de date, este nevoie de o modalitate de a
distinge ce set de date se va utiliza.
Considerând două tabele

Tabela1 Tabela2
Inaltim Ge
Id Greutate Id DataNasterii Nume
e n
001 155 68 001 10/15/1960 M Popescu
003 250 74 002 08/01/1955 M Ionescu
004 110 63 003 12/25/1988 F Georgescu
005 95 60 005 05/28/1949 F Ion

PROC SQL;
SELECT tabela1.Id,
tabela2.Id,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1,
exemple. Tabela2;
QUIT;
Deoarece coloana Id este în ambele tabele, prefixați numele variabilei cu numele tabelului.
Rezultatul va fi:
Inaltim
Id Id Greutate Nume Gen
e
00
001 68 155 Popescu M
1
00
002 68 155 Ionescu M
1
00
003 68 155 Georgescu F
1
00
005 68 155 Ion F
1
00
001 74 250 Popescu M
3

15
00
002 74 250 Ionescu M
3
00
003 74 250 Georgescu F
3
00
005 74 250 Ion F
3
00
001 63 110 Popescu M
4
00
002 63 110 Ionescu M
4
00
003 63 110 Georgescu F
4
00
005 63 110 Ion F
4
00
001 60 95 Popescu M
5
00
002 60 95 Ionescu M
5
00
003 60 95 Georgescu F
5
00
005 60 95 Ion F
5

Dacă doriți să păstrați ambele valori de Id din fiecare set de date, puteți redenumi coloanele,
astfel:
PROC SQL;
SELECT tabela1.Id AS tabela1.Id ,
tabela2.Id AS tabela2.Id,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1,
exemple. Tabela2;
QUIT;

Un produs cartezian este util în special atunci când doriți să efectuați potriviri între nume în
două tabele similare. Numărul de rânduri din tabelul rezultat este numărul de rânduri din primul
table înmulţit cu numărul de rânduri din al doilea tabel.

În practică, se adaugă o clauză WHERE pentru a restricționa ce rândurile selectate.

16
În programul care urmează, adăugăm o clauză WHERE pentru a selecta numai acele rânduri în

care numărul subiectului este același în cele două tabele. În afară de adăugarea unei clauze
WHERE, programul următor arată cum să se facă distincția între două coloane ambele cu acelaşi
nume.
PROC SQL;
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1 AS t1,
exemple. tabela2 AS t2
WHERE t1.Id EQ t2.Id ;
QUIT;

Numai subiecții care se află în ambele tabele sunt enumera ți. În terminologia SQL, aceasta se
numește o conexiune internă (inner join). Este echivalent cu o interclasare (merge) într-o etapă
DATA în care fiecare dintre cele două seturi de date contribuie la îmbinare.
PROC SORT DATA= exemple. tabela1 OUT= tab1;
BY Id;
RUN;
PROC SORT DATA= exemple. tabela2 OUT= tab2;
BY Id;
RUN;
DATA inner;
MERGE tab1 (IN=in1)
tab2 (IN=in2);
BY Id;
IF in1 AND in2;
RUN;
TITLE " Inner Join cu DATA Step";
PROC PRINT DATA=inner;
ID Id;
RUN;
Left, Right şi Full Joins
O alternativă este de a separa numele celor două tabele cu termenul INNER
JOIN
PROC SQL;
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,

17
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1 AS t1 INNER JOIN
exemple. tabela2 AS t2
ON t1.Id EQ t2.Id ;
QUIT;
Una dintre regulile SQL este că atunci când se utilizează cuvântul cheie JOIN pentru a realize o
joncţiune între două tabele, se va folosi o clauză ON în locul unei clauze WHERE (după care
din rezultat se poate crea un subset cu o clauză WHERE).

LEFT JOIN include toate rândurile din prima (stânga) tabelă și acele rânduri din a doua tabelă
în care există o valoare corespunzătoare în primul tabel.

RIGHT JOINS include toate rândurile din tabelul 2 (dreapta) și numai rândurile potrivite din
primul tabel.
FULL JOINS include toate rândurile din ambele tabele (echivalent cu o MERGE într-un pas
DATA).
PROC SQL;
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Greutate,
Nume,
Gen
FROM exemple. tabela1 AS t1,
exemple. tabela2 AS t2
WHERE t1.Id EQ t2.Id ;
QUIT;

PROC SQL;
TITLE "Left Join";
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Gen
FROM exemple.tabela1 AS t1 LEFT JOIN

18
exemple.tabela2 AS t2
ON t1.Id EQ t2.Id ;
TITLE "Right Join";
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Gen
FROM exemple.tabela1 AS t1 RIGHT JOIN
exemple.tabela2 AS t2;
ON t1.Id EQ t2.Id ;
TITLE "Full Join";
SELECT t1.Id AS Id_ tabela1,
t2.Id AS Id_ tabela2,
Inaltime,
Gen
FROM exemple.tabela1 AS t1 FULL JOIN
exemple.tabela2 AS t2
ON t1.Id EQ t2.Id ;
QUIT;

II.10.1. Concatenarea seturilor de date

Într-un pas DATA, concatenarea a două seturi de date, se face denumindu-le într-o singură
instrucțiune SET.
În PROC SQL, se utilizează un operator UNION pentru a concatenarea rândurilor selectate din
cele două tabele.

Operator Descriere
Union Corespondenţa se face între poziția coloanei (nu cu numele coloanei) și
se elimină duplicatele
Union All Corespondenţa se face între poziția coloanei (nu cu numele coloanei) și
nu se elimină duplicatele
Union Corespondenţa se face între numele coloanei și se elimină duplicatele
Corresponding
Union All Corespondenţa se face între numele coloanei și nu se elimină duplicatele
Corresponding
Except Corespondenţa se face între numele coloanei și se elimină rândurile
gasite în ambele tabele
Intersection Corespondenţa se face între numele coloanei și se păstrează rândurile
unice din ambele tabele

19
Fie fişierele
Tabela1 Tabela2 Tabela3
Greutat Ge
Id Inaltime Id DataNasterii Nume Id Gen Nume DataNasterii
e n
00 155 68 001 10/15/1960 M Popescu 010 F Vasile 03/05/1977

1
00 250 74 002 08/01/1955 M Ionescu 013 M Andre 06/07/1999

3 i
00 110 63 003 12/25/1988 F Georgescu
4
00 95 60 005 05/28/1949 F Ion
5

Să presupunem că se doreşte să se adauge date din tabela 3 în setul de date tabela2 și noul set de
date să se numească tabela_rez folosind PROC SQL. (coloanele nu sunt în aceeași ordine cu
setul de date tabela 2.)
PROC SQL;
CREATE TABLE tabela_rez AS
SELECT *
FROM exemple.tabela2 UNION ALL CORRESPONDING
SELECT *
FROM exemple.tabela3
QUIT;

Se va obţine

Tabela_rez
Id DataNasterii Gen Nume
00 10/15/1960 M Popescu
1
00 08/01/1955 M Ionescu
2
00 12/25/1988 F Georgescu
3
00 05/28/1949 F Ion
5
010 03/05/1977 F Vasile
013 06/07/1999 M Andrei

II.10.3. Utilizarea funcţiilor Summary în PROC SQL

Puteți utiliza funcții precum MEAN și SUM pentru a crea noi variabile care reprezintă medii sau
sume ale altor variabile.
De asemenea, puteți crea noi variabile în cadrul interogării.
20
Să presupunem că doriți să exprimați înălțimea fiecărei persoane în setul de date pentru sănătate
ca procent din înălțimea medie a tuturor subiecților (folosind un pas DATA, ar trebui mai întâi
să utilizați PROC MEANS pentru a crea un set de date care să conțină înălțimea medie. Veți
combina apoi cu setul de date original și efectuați calculul).

PROC SQL;
SELECT Id,
Inaltime,
Greutate,
MEAN(Inaltime) AS Inaltime_Medie,
100* Inaltime /CALCULATED Inaltime_Medie AS Procent_Inaltime
FROM exemple.tabela1
QUIT;
Înălțimea medie se calculează utilizând funcția MEAN. Această valoare este dată și variabilei
Inaltime_Medie. Când utilizați această variabilă într-un calcul, trebuie să o precede cu cuvântul
cheie CALCULATED, astfel încât PROC SQL să nu caute variabila într-unul din seturile de
date de intrare.
PROC SQL poate sorta tabelul dacă utilizați o clauză ORDER

PROC SQL;
SELECT Id,
Inaltime,
Greutate,
FROM exemple.tabela1
ORDER BY Inaltime;
QUIT;

II.10.4. Corespondenţe neclare


Fie tabelele
Tabela2 Tabela4
Id DataNasterii Gen Nume Nume Tip
00 10/15/1960 M Popescu Poescu F
1
00 08/01/1955 M Ionescu Andrei M

2
00 12/25/1988 F Georgescu Ion F
3
00 05/28/1949 F Ion Ionesc M
5 u

Joncţiunea tabelelor după nume


PROC SQL;

21
SELECT Id,
t2.Nume AS tabela2_nume,
t4.Nume AS tabela4_nume
FROM exemple.tabela2 AS t2,
exemple.tabela4 AS t4
WHERE SPEDIS(tabela2_nume , tabela4_nume ) LE 25;
QUIT;

Funcția SPEDIS permite scrierea greșită.


Clauza WHERE funcționează pe fiecare combinație de nume din cele două tabele și selectează
acele nume care se află într-o distanță de ortografie de 25.

II.11. Prelucrarea variabilelor cu ajutorul masivelor


Masivul SAS reprezintă o colecție de elemente (de obicei variabilele SAS) care permit scrierea
de declarații SAS care fac trimitere la acest grup de variabile.

Masivele SAS sunt diferite de cele din multe alte limbaje de programare. Ele nu dețin valori și
permit referirea, într-o manieră convenabilă, la o colecție de variabile SAS.

Sintaxa simplificată pentru un masiv unidimensional:


ARRAY nume(n) $ lista_variabile;
unde:
- nume = numele masivului. Numele matricilor urmează aceleași reguli ca şi pentru
variabilele SAS;
- n = numărul de elemente. Dacă numărul de elemente este necunoscut el se înlocuieşte cu
caracterul *
- $ = se foloseşte în cazul în care sunt referite variabile de tip caracter, de obicei când
acestea nu au fost definite;
- parantezele rotunde pot fi înlocuite cu paranteze pătrate sau acolade.
- lista_variabile. Trebuie să fie toate numerice sau toate alfanumerice - nu le puteți
amesteca.
Această sintaxă poartă denumirea de masiv explicit, în care numărul de variabile este specificat
la definire.
Pentru a referi o variabilă din masiv se va folosi sintaxa nume(index), indexul unui masiv
începând de la 1.

22
II.12.1. Inlocuirea valorilor într-un set de date SAS

DATA date1;
SET exemple.date;
ARRAY matrice{3} Inaltime Greutate Varsta;
DO i = 1 TO 3;
IF matrice{i} = 999 THEN matrice{i} = .;
END;
DROP i;
RUN;

Instrucțiunea ARRAY este utilizată pentru a crea matricea.

 Puteți utiliza oricare dintre metodele de prescurtare SAS pentru a face trimitere la o listă de
variabile, cum ar fi Var1-Varn.
 Numărul din paranteze care urmează după numele matricei se numește un indice, chiar dacă
nu este o notație adevărată a indexului
 Prin plasarea matricei într-o buclă DO, puteți procesa fiecare variabilă în matrice.
 De asemenea, deoarece nu aveți nevoie sau nu doriți ca contorul de buclă DO să fie inclus în
setul de date SAS, să utilizați o instrucțiune DROP.
 Dacă doriți ca matricea să conțină variabile noi, trebuie să includeți un semn de dolar ($) și,
opțional, o lungime atunci când definiți matricea. De exemplu, pentru a crea o matrice de
variabile de tip caracter Q1-Q20, fiecare cu o lungime de 2 octeți, ați scrie următoarele:

array matrice{20} $ 2 Q1-Q20;

Următorul program folosește o matrice de caractere pentru a converti toate valorile NA (nu se
aplică) sau semnul de întrebare (?) la o valoare lipsă SAS. Să presupunem că exista un set de
date SAS tabela5 și doriți să creați un nou set de date numit tabela_Lipsă cu aceste modificări.
DATA tabela_Lipsă;
SET exemple. tabela5;
ARRAY var_car {*} $ _CHARACTER_;
DO LOOP = 1 TO DIM(var_car);
IF var_car {LOOP} IN ('NA' '?') THEN
CALL MISSING(var_car {LOOP});
END;
DROP LOOP;
RUN;

23
Cuvântul cheie _CHARACTER_ este folosit ca listă de variabile. Deoarece această instrucțiune
urmează instrucțiunea SET, _CHARACTER_ include toate variabilele de caractere din setul de
date tabela5.

_CHARACTER_ menționează variabilele de caractere care sunt prezente în zona buffer la acel
moment din etapa DATA. De exemplu, dacă definiți variabilele de caractere A, B și C în primele
trei rânduri ale unui pas DATA și apoi folosiți referința _CHARACTER_ urmată de definirea
variabilelor de caractere D și E, numai variabilele A, B și C sunt menționate de către
_CHARACTER_ .

Dacă plasați instrucțiunea ARRAY înaintea instrucției SET, matricea nu face referință la nici o
variabilă.

Funcția DIM returnează numărul elementelor dintr-un matrice.

Programul următor realizează conversia tuturor valorilor de caractere dintr-un set de date SAS la
litere mici.
DATA tabela_rez;
SET exemple.tabela6;
ARRAY matrice{*} _CHARACTER_;
DO i = 1 TO DIM(matrice);
matrice{i} = LOWCASE(matrice{i});
END;
DROP i;
RUN;

II.12.2. Utilizarea unei matrici pentru a crea noi variabile


De exemplu, dacă setul de date SAS avea variabile Fahren1-Fahren24 care conține 24 de
temperaturi de Fahrenheit, ați putea folosi o matrice pentru a crea 24 de variabile noi (de
exemplu, Celsius1-Celsius24) cu echivalentele Celsius
DATA temp;
INPUT Fahren1-Fahren24 @@;
ARRAY Fahren[24];
ARRAY Celsius[24] Celsius1-Celsius24;
DO Hour = 1 TO 24;
Celsius{Hour} = (Fahren{Hour} - 32)/1.8;
END;
DROP Hour;
DATALINES;
35 37 40 42 44 48 55 59 62 62 64 66 68 70 72 75 75
72 66 55 53 52 50 45
;

24
Setul de date Temp conține toate temperaturile de 24 de grade Fahrenheit și 24 de grade Celsius.
S-ar putea să vă întrebați de unde a apărut lista variabilelor în matricea FAHREN. Dacă omiteți
o listă de variabile într-o instrucțiune ARRAY și includeți numărul elementelor care urmează
numele matricei, SAS va crea automat nume de variabile pentru dvs., utilizând numele matricei
ca bază și adăugând numerele de la 1 la n, unde n este numărul elementelor din matrice.

În acest program, SAS creează variabilele Fahren1-Fahren24. Ați putea fi folosit această
caracteristică și pentru matricea Celsius.

II.12.3. Schimbarea limitelor matricei


Implicit, SAS numără elementele unui matrice începând de la 1. Există momente în care este util
să se specifice valorile de început și de sfârșit ale elementelor matrice. De exemplu, dacă aveți
variabilele Venit1999 la Venit2006, ar fi bine să aveți elemente de matrice începând cu 1999 și
încheind cu 2006.
DATA contabilitate;
INPUT ID Venit1999- Venit2006;
ARRAY venit{1999:2006} Venit1999– Venit2006;
ARRAY taxe{1999:2006} Taxe1999-Taxe2006;
DO An = 1999 TO 2006;
Taxe{An} = .25*Venit{An};
END;
DROP An;
FORMAT Venit1999- Venit2006
Taxes999-Taxe2006 dollar10.;
DATALINES;
001 45000 47000 47500 48000 48000 52000 53000 55000
002 67130 68000 72000 70000 65000 52000 49000 40100
;

II.12.4. Matrici temporare


Puteți crea o matrice care are numai elemente și nu există variabile! Deşi sună ciudat, elementele
din matricele temporare sunt locuri excelente pentru a stoca valori sau pentru a efectua căutări de
tabele.
Dacă doriți, puteți atribui valorile inițiale ale elementelor de matrice atunci când creați matricea
temporară. Alternativ, puteți încărca valorile în matricea temporară din etapa DATA.

Oricum, valorile din matricea temporară sunt reținute automat (adică nu sunt setate la valori lipsă
atunci când etapa DATA se repetă). Astfel, acestea sunt locuri utile pentru stocarea valorilor de
care aveți nevoie în timpul executării etapei DATA.

25
Începem cu un exemplu care utilizează o matrice temporară pentru a stoca răspunsul corect
pentru fiecare din cele 10 întrebări dintr-un test cu mai multe opțiuni. Apoi puteți puncta testul
utilizând matricea temporară ca şi cheie de răspuns. Iată programul:

II.12. Realizarea de rapoarte agregate şi de detaliu


II.10.1. Afişarea datelor

Afişarea datelor se realizează cu ajutorul preocedurii PRINT (PROC PRINT).


De exemplu, există o tabelă numită tabela-vanzări care conţine următoarele informaţii: numele
angajatului care a efectuat vânzarea (Nume_ang) și codul de identificare al acestuia(Id_ang),
regiunea în care a efectuat vânzarea(Regiune), numele companiei căreia i sa făcut vânzarea
(Nume_client), codul produsului (Cod_prod), cantitatea (Cant), preţul unitar al produsului
(PU)și suma totală a vânzării (Total_vanzari) (Cant * PU).
Programul următor utilizează PROC PRINT cu toate valorile implicite:

TITLE "Raport Vânzări";


PROC PRINT DATA=tabela-vanzari;
RUN;

Procedura PRINT va afişa atâtea coloane câte încap pe lăţimea paginii, iar cele care nu încap vor
fi afişate după terminarea tutror observaţiilor. In plus, va apărea o coloană (cu antetul Obs) care
va conţine numărul current al fiecărui rând de observaţii.
Declarația VAR permite specificarea variabilelor care vor fi afişate şi ordinea lor. De exemplu,
dacă dorim să afişăm numai variabilele Nume_ang, Nume_client şi Nume_client, se va folosi
codul:

TITLE "Raport Vânzări";


PROC PRINT DATA=tabela-vanzari;
VAR Nume_ang Nume_client Total_vanzari;
RUN;

Dacă se doreşte omiterea coloanei care conţine numărul current şi înlocuirea ei cu o altă
variabilă, se foloseşte opţiunea ID:

TITLE "Raport Vânzări";


proc print data=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Total_vanzari;
RUN;

26
Variabila (sau variabilele) pe care le plasați în instrucțiunea ID înlocuiește coloana Obs și este
afişată în coloana cea mai din stânga ale înregistrării.

Când plasează un nume de variabilă în opţiunea ID, nu nu trebuie inclus și în instrucțiunea VAR
deoarece variabila va apărea de două ori în listă.

O modalitate alternativă de a omite coloana Obs este de a folosi PROC PRINT cu opțiunea
NOOBS. Avantajul utilizării unei instrucțiuni ID este că variabila ID va apărea pe fiecare pagină
dacă există mai multe variabile decât încap într-o singură pagină.
Se poate schimba aspectul valorilor din lista prin asocierea unui format cu una sau mai multe
variabile (SAS are multe formate încorporate care pot adăuga virgule sau semne de dolari în cifre
sau pot afișa date în diferite moduri). De exemplu se doreşte ca valorile Total_vanzari să apară
cu semne de dolari și virgule. Acest lucru se realizează cu o opţiunea FORMAT la lista
Total_vanzari cu semne de dolari și virgule și Cant cu virgule:

TITLE "Raport Vânzări";


PROC PRINT DATA=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Cant Total_vanzari;
FORMAT Total_vanzări dollar10.2 Cant comma7.;
RUN;

Se poate controla ce observații apar într-o listă prin includerea unei instrucțiuni WHERE în
procedură. De exemplu, dacă se doreşte ca listarea să conțină numai observații în cazul în care
cantitatea este mai mare de 400:
title "Raport Vânzări";
proc print data=tabela-vanzari;
where Cant gt 400;
ID Nume_ang;
VAR Nume_client Cant Total_vanzari;
format Total_vanzări dollar10.2 Cant comma7.;
run;

Dacă se doreşte afişareavânzăeilor doar a angajaţilor 1 şi 5 se utilizează operatorul IN (posibil de


utilizat pentru valori numerice sau character) împreună cu o instrucțiune WHERE.

title "Raport Vânzări";


proc print data=tabela-vanzari;
where EmpID in ('1' '5');
ID Nume_ang;
VAR Nume_client Cant Total_vanzari;

27
format Total_vanzări dollar10.2 Cant comma7.;
run;

In raport se pot adăuga linii de titlu suplimentare și una sau mai multe note de subsol.
Instrucțiunea TITLEn (unde n este un număr de la 1 la 10) permite să să se specifice mai multe
linii de titlu ( TITLE1 și TITLE sunt echivalente).

Instrucțiunea FOOTNOTEn vă permite să să se specifice de la 1 la 10 note de subsol, linii care


apar în partea de jos a paginii. Odată ce se scrie o instrucțiune TITLE sau FOOTNOTE, titlurile
sau notele de subsol se imprimă pe fiecare pagină a raportului, până când ele sunt modificațte
sau le anulate.
title1 "Compania ABX";
title3 "Cifre vanzari pentru anul fiscal 2018";
title4 "Raport rezlizat de Popescu Vasile";
title5 "-----------------------------";
footnote "Raportul este condidential";

proc print data=tabela-vanzari;


ID Nume_ang;
VAR Nume_client Cant Total_vanzari;
format Total_vanzări dollar10.2 Cant comma7.;
run;

Pentru a anula titlurile sau notele anterioare se utilizează instrucţiunile title; şi footnote;
Dacă se doreşte ca afişarea să fie într-o anumită ordine preocedura PROC PRINT va fi precedată
de o procedură PROC SORT (pentru a vedea înregistrările în ordine descendentă se folose ste
cuvântul cheie DESCENDING,
proc sort data= tabela-vanzari;
by descending Total_vanzari;
run;
title "Raport Vânzări";
proc print data=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Total_vanzari;
run;

Dacă nu de doreşte ca setul de date original să se modifice, se adaugă o opțiune OUT = la


sortare. pentru a specifica un set de date de ieșire (care va fi un set de date temporar).

proc sort data= tabela-vanzari out=vazari;

28
by descending Total_vanzari;
run;
title "Raport Vânzări";
proc print data=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Total_vanzari;
run;

Sortarea se poate realiza după mai multe variabile, de exemplu pentru ca observaţiile să fie
afişate în ordinea crescă toare a cos_angajat, iar pentru fiecare angajatm în ordinea
descrescătoare a vânzărilor, se poate folosi codul:

proc sort data= tabela-vanzari out=vazari;


by Cod_angajat descending Total_vanzari;
run;
title "Raport Vânzări";
proc print data=tabela-vanzari;
ID Nume_ang;
VAR Nume_client Total_vanzari;
run;

În mod implicit, raportul va conţine ca şi cap de table, numele variabilelor. Dacă se doreşte
utilizarea, în locul acestora, a etichetelor variabilelor se va utilize instrucţiunea LABEL (se va
utiliza o instrucțiune LABEL, fie în pasul DATA, fie o instrucțiune care urmează instrucțiunea
PROC PRINT. Se va adăuga o opțiune LABEL la instrucțiunea PROC PRINT).

title "Raport Vânzări";


proc print data=tabela-vanzari label;
ID Nume_ang;
VAR Nume_client Total_vanzari;
label Cod_angajat = "Cod Angajat"
Total_vanzari = "Vanzări totale"
Cant = "Cantitate vanduta";
run;

Se pot adăuga subtotaluri și totaluri la raport, incluzând instrucțiunile SUM și BY.

Pentru a include o instrucțiune BY în PROC PRINT, setul de date trebuie să fie ordonat anterior
în aceeași ordine.

De exemplu, dacă se doreşte defalcarea raportului pe regiuni, mai întâi se sortează setul de date
pe regiuni și se include o declarație BY în PROC PRINT.

29
proc sort data= tabela-vanzari out=vanzări;
by Region;
run;

title " Raport Vânzări ";


proc print data= tabela-vanzari label;
by Regiune;
ID Nume_ang;
VAR Nume_client Total_vanzari;
label Cod_angajat = "Cod Angajat"
Total_vanzari = "Vanzări totale"
Cant = "Cantitate vanduta";
run;

Dacă se doreşte ca fiecare regiune să apară pe o pagină separată, se include o instrucțiune


PAGEBY, precum și o instrucțiune BY în PROC PRINT. Pentru a include subtotaluri și totaluri
se includ declarații SUM .

proc sort data= tabela-vanzari out=vanzări;


by Region;
run;

title " Raport Vânzări ";


proc print data= vanzări label;
by Regiune;
ID Nume_ang;
VAR Nume_client Total_vanzari;
sum Cant Total_vanzari;
label Cod_angajat = "Cod Angajat"
Total_vanzari = "Vanzări totale"
Cant = "Cantitate vanduta";
format Total_vanzari dollar10.2 Cant comma7.;
run;

Dacă se include o instrucțiune BY și o instrucțiune ID, fiecare cu aceleași variabile, PROC


PRINT nu repetă variabila din prima coloană dacă valoarea nu sa schimbat.
proc sort data= tabela-vanzari out=vanzări;
by Region;
run;

title " Raport Vânzări ";


proc print data= vanzări label;
by Nume_ang;
ID Nume_ang;
VAR Nume_client Total_vanzari;
label Cod_angajat = "Cod Angajat"
30
Total_vanzari = "Vanzări totale"
Cant = "Cantitate vanduta";
format Total_vanzari dollar10.2 Cant comma7.;
run;

Prin includerea opțiunii N = în PROC PRINT, numărul total de observații din setul. de date se
imprimă în partea de jos a listei. Dacă se doreşte se poate utiliza formularea N = "eticheta dvs."
pentru a eticheta acest număr cu o etichetă aleasă de utilizator.
proc sort data= tabela-vanzari out=vanzări;
by Region;
run;

title " Raport Vânzări ";


proc print data= vanzări label n=”Numărul total de observaţii:”;
ID Nume_ang;
VAR Nume_client Total_vanzari;
label Cod_angajat = "Cod Angajat"
Total_vanzari = "Vanzări totale"
Cant = "Cantitate vanduta";
format Total_vanzari dollar10.2 Cant comma7.;
run;
Acest cod va genera o listă de tipul următor:
Raport Vânzări
Cod angajat Vanzări totale Cantitate vanduta
0017 $19,995.00 500
0017 $1,995.00 100
...
1843 $9,109.00 1
9888 $299.50 50
9888 $1,990.00 1,000
Numărul total de observaţii: 14
Opţiunea DOUBLE utilizată în PROC PRINT va dubla spaţiile dintre rânduri (proc print data=
vanzări double;)
Opţiunea OBS=n premite utilizată în PROC PRINT listarea primelor n observăţii (proc print
data= vanzări (obs=5);)
Pentru a lista un anumit număr de observaţii nu de la prima observaţie ci din alt punct, se va
combina opţiunea FIRSTOBS=n cu Opţiunea OBS=n (proc print data= vanzări (firstobs=4
obs=7);). De reţinut că n nu reprezintă numărul de obsevaţii care vor fi listate ci numărul
ultimei observaţii.

31
PROC PRINT uneori imprimă numele variabilelor pe verticală dacă numele variabilelor ocupă
mai mult spațiu decât următoarele linii de date. Dacă se doreşte ca PROC PRINT să mențină
numele variabilelor pe orizontală, se va include opțiunea HEADING = Horizontal (se poate
abrevia la HEADING = H) (proc print data= vanzări (obs=5) heading = horizontal;)

II.10.2. Crearea rapoartelor personalizate

Procedura PROC REPORT permite controlul aspectului fiecărei coloane de raport, obţinerea de
rapoarte de sinteză și listări detaliate.

Opțiunea NOWD (fără ferestre) este o instrucțiune care face să nu se intre în editorul de ferestre
interactiv după ce executați procedura.

Pentru variabilele de tip caracter, lățimea coloanei este fie lungimea variabilei caracter, fie
lungimea valorii formatate (dacă variabila are un format).

Pentru variabilele numerice, lățimea coloanei implicite este de 9 ori lățimea unui format (dacă
variabila este formatată).

O altă diferență între PROC PRINT și PROC REPORT este că titlurile coloanelor implicite
pentru PROC PRINT sunt nume de variabile, iar titlurile coloanelor implicite pentru PROC
REPORT sunt etichete variabile (dacă există) sau nume de variabile dacă o variabilă nu are o
etichetă.

Pentru a specifica variabilele pe care doriți să le includeți în raport, utilizați o instrucțiune


COLUMN.

Instrucțiunea COLUMN servește o funcție similară cu instrucțiunea VAR a PROC PRINT -


permite să selectați variabilele pe care le doriți în raport și ordinea în care acestea apar.

În plus, trebuie să listați variabilele pe care le creați în blocurile COMPUTE (discutate mai
târziu în acest capitol).
Spre deosebire de PROC PRINT, PROC REPORT este capabil să producă atât rapoarte
detaliate (lista tuturor observațiilor) cât și rapoarte sumarizate (raportarea statisticilor, cum ar fi
sumele – statistici implicite și medile).

Implicit, PROC REPORT produce

 rapoarte detaliate pentru variabilele de tip caracter


32
 și rapoartele sumarizate pentru variabilele numerice.

Cu toate acestea, atunci când se include un mix de ambele tipuri de variabile într-un singur
raport, se obţine o listă detaliată care prezintă toate observațiile.

Puteți utiliza o instrucțiune DEFINE pentru a specifica modul de folosire al fiecarei variabile;
utilizați o listă a tuturor observațiilor și utilizați ANALIZA pentru a crea un raport sumar.

Dacă variabilele sunt numerice şi se doreşte un raport de sinteză se poate utilize un program ca:
TITLE "Raport de sinteza pentru variabile numerice";
PROC REPORT DATA=exemple.date1 NOWD;
COLUMN varsta greutate;
RUN;
Rezultat:
Raport de sinteza pentru variabile numerice
Varsta
elev greutate
40 210

Să presupunem că doriți o listă detaliată a fiecărei persoane din setul de date date1 în locul unui
raport de sinteză. Ați putea folosi următorul program:

TITLE " Raport detaliat pentru variabile numerice";


PROC REPORT DATA=exemple.date1 NOWD;
COLUMN varsta greutate;
DEFINE varsta / DISPLAY "Varsta elev" WIDTH=2;
DEFINE greutate / DISPLAY WIDTH=3;
RUN;

 există acum o instrucțiune DEFINE pentru fiecare dintre cele două variabile numerice
 atributele pentru variabile sunt introduse ca opțiuni în instrucțiunea DEFINE (astfel, ele
urmează o bară după numele variabilei).
 opțiunea DEFINE DISPLAY este o instrucțiune pentru a obține o listă detaliată a tuturor
observațiilor.
 Pe lângă definirea utilizării ca DISPLAY, instrucțiunea DEFINE pentru varsta adaugă o
etichetă (plasată în ghilimele) și o lățime a coloanei.
Rezultatul este:
Raport detaliat pentru
Varsta

33
elev greutate
7 40
8 38
6 48
10 50
12 45

Realizarea unui Summary Report

Să presupunem ca doriti să listaţi media vârstei şi media greutăţii elevilor grupaţi pe clase. Pentru
a face acest lucru, trebuie să utilizați opţiunea GROUP pentru variabila clasa. În plus, trebuie să
specificați MEAN ca statistică pentru varsta și greutate.

TITLE "Utilizare optiune GROUP";


PROC REPORT DATA=exemple.date1 NOWD;
COLUMN clasa varsta greutate;
DEFINE clasa / GROUP WIDTH=2;
DEFINE varsta / ANALYSIS MEAN "Varsta medie" WIDTH=12
FORMAT=2.;
DEFINE greutate / ANALYSIS MEAN "Greutate medie" WIDTH=12
FORMAT=3.;
RUN;
PROC REPORT poate încadra linii de text într-o coloană atunci când există valori lungi.
Pentru a demonstra această caracteristică, aici este un raport care include o variabilă numită
Comentariu cu o lungime de 50 de caractere. Deoarece o valoare atât de lungă ar ocupa
majoritatea lățimii unei pagini, se poate utiliza opțiunea FLOW pentru a îmbunătăți aspectul
raportului. Iată codul pentru a realiza acest lucru:

PROC REPORT DATA=exemple.date1 NOWD HEADLINE


SPLIT=' ' LS=74;
COLUMN Id data gen inaltime greutate Comment;
DEFINE Id / "Numar matricol" WIDTH=7;
DEFINE data / "Data examinare" WIDTH=9 FORMAT=date9.;
DEFINE gen / "Gen elev" WIDTH=1 RIGHT;
DEFINE inaltime / "Inaltime" WIDTH=3;
DEFINE Greutate / WIDTH=2;
DEFINE Comment / WIDTH=30 FLOW;
RUN;

Opţiunea FLOW, adăugată la instrucțiunea DEFINE, restrânge câmpul de comentarii în lățimea


de coloană definită prin WIDTH=.

34
Opțiunea SPLIT = indică faptul că se doreşte ca la împărţirea comentariilor, între cuvinte să se
folosească spații libere. Fără această opțiune, PROC RAPORT ar folosi alte caractere, cum ar fi
slash-uri ca posibile pauze de linie.

Opțiunea RIGHT, utilizată pentru o variabilă, aliniază dreapta valorile acesteia. Alinierea
implicită pentru variabilele de tip alphanumeric este LEFT. Opțiunile de aliniere sunt LEFT,
RIGHT și CENTER.

35
36

S-ar putea să vă placă și