Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* tworzenie biblioteki */
- libname s "/folders/myfolders" inencoding=any;
- /* SAS 4GL - przetwarzanie wierszowe */
- /*1*/
- /* pobierz dane z tabeli sashelp.CARS, dokonując selekcji wierszy
- tylko dla pojazdów Audi */
- data s._123AUDI ; /* data- uwtórz tabelę */
- set sashelp.cars ; /* set- pobierz z*/
- where make='Audi';
- run ; /* znacznik konca bloku kodu */
- /* 2 */
- /* wybierz audi lub bmw oraz zachowaj tylko
- kolumny make, model, invoice */
- data s.audi_bmw; /*(keep=make Model Invoice)*/
- ;
- set sashelp.cars;
- where make ='Audi' or make='BMW';
- /*where make in ('Audi', 'BMW');*/
- keep make Model Invoice; /*drop */
- run;
- /* 3 */
- /* znajdz najdrozsze auto w tabeli, na podstawie
- kolumny invoice */
- /* najpierw sortowanie */
- proc sort data=sashelp.cars
- out=s.cars_sort (keep=make Model Invoice);
- by descending invoice;
- run;
- data s.cars_sort;
- set s.cars_sort;
- IF _N_<=5 ; /*_N_ - numerator */
- run;
- /* 4*/
- /* jak zliczyć wartosc wszystkich pojazdów
- w tabeli cars */
- data s.wartosc_cars;
- set sashelp.cars end=koniec;
- /* znacznik konca tabeli*/
- wartosc+invoice;
- keep make model wartosc invoice;
- if koniec then
- output;
- /* zrzucę ostatni wiersz w tabeli*/
- run;
- /* 5 */
- /* przetwarzanie w grupach */
- /* podaj liczbę pojazdów w podziale na markę */
- data s.liczba_pojazdow;
- set sashelp.cars;
- by make ; /* group by */
- /* uwaga - dane musza być posortowane
- wg danej kolumny*/
- if first.make then
- liczba_pojazdow=0;
- liczba_pojazdow + 1;
- if last.make then
- output;
- /*if last.make;*/
- keep make liczba_pojazdow;
- run;
- /* 6 */
- /* grupowanie */
- /* podaj wartosc pojazdów w podziale na markę */
- data s.wartosc_pojazdow;
- set sashelp.cars;
- by make;
- if first.make then
- wartosc_pojazdow=0;
- wartosc_pojazdow + invoice;
- if last.make then
- output;
- keep make wartosc_pojazdow;
- run;
- /*7*/
- /* podaj ilosc i wartosc */
- data s.wartosc_pojazdow;
- set sashelp.cars;
- by make;
- if first.make then
- do;
- liczba_pojazdow =0;
- wartosc_pojazdow=0;
- end;
- liczba_pojazdow + 1;
- wartosc_pojazdow + invoice;
- if last.make then
- output;
- keep make wartosc_pojazdow liczba_pojazdow;
- run;
- /*******************************************/
- /* 07/10/2018 */
- /*******************************************/
- /* 1*/
- /* if then else */
- /* na podstawie kol. invoice
- chcemy podzielić pojazdy na kategorie*/
- data s.kategoria_cenowa;
- set sashelp.cars;
- length kategoria $7;
- if invoice<30000 then
- kategoria='tanie';
- else if invoice<60000 then
- kategoria='średnia';
- else kategoria='drogie';
- keep make Model Invoice kategoria;
- run;
- /* 2*/
- /* na podstawie tabeli kategoria_cenowa zlicz pojazdy
- w kazdej kategorii cenowej */
- proc sort data= s.kategoria_cenowa;
- by kategoria;
- run;
- data s.kategoria_cenowa_zlicz;
- set s.kategoria_cenowa;
- by kategoria;
- if first.kategoria then
- licz_pojazdy=0;
- licz_pojazdy +1;
- if last.kategoria;
- keep kategoria licz_pojazdy;
- run;
- /* 3 */
- /* na podstawie kolumny invoice utwórz nową kolumnę nowa_cena,
- która stanowi 90% wartość invoice,
- nową cenę zaokrąglić do mc setnych */
- data s.nowa_cena;
- set sashelp.cars;
- nowa_cena = ROUND(invoice * 0.9, 0.01);
- keep make model Invoice nowa_cena;
- format nowa_cena dollar20.2;
- run;
- /* daty w SAS */
- /* 4 */
- data s.daty;
- dzis=today();
- format dzis ddmmyy10.;
- /*format dzis date9.;*/
- wiek = dzis - '25JAN1995'd;
- dzien=day(dzis);
- dzien_tyg=weekday(dzis);
- mies=month(dzis);
- tydz=week(dzis);
- kw=qtr(dzis);
- run;
- /******************************************/
- /* Łączenie tabel */
- /******************************************/
- /* wygenerujemy przykąłdowe tabele */
- data s.tabela_A;
- do id=1 to 1000;
- kolumna_A='ABC';
- output;
- end;
- run;
- data s.tabela_B;
- do identyfikator=1 to 1500 by 10;
- kolumna_B='BBB';
- output;
- end;
- run;
- /* * klucz do łączenia musi miec tę samą nazwę */
- /* * tabele do łaczenia musza byc w ten sam sposób
- posortowane po kolumnie kluczu */
- /* * merge - łączenie */
- proc sort data=s.tabela_A;
- by id;
- run;
- proc sort data=s.tabela_B;
- by identyfikator;
- run;
- data s.merged;
- merge s.tabela_A (in=a)
- s.tabela_B (rename=(identyfikator=ID) in=b );
- by id ; /* kolumna do łaczenia*/
- if a=b /* lub a=1 and b=1 */
- ; /* mechanizm łaczenia */
- run;
- /**********************************/
- /* dane bibiloteka */
- libname b "/folders/myfolders" inencoding=any;
- /* ustal czytelników, którzy nie oddali ksiazki */
- /* ustal imie, nazwisko, miasto czytelnika */
- proc sort data=b.CZYTELNIK;
- by id;
- run;
- proc sort data=b.WYPOZYCZENIA;
- by CZYTELNIK_ID;
- run;
- data b.czarna_lista;
- retain CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;
- merge
- b.WYPOZYCZENIA (rename=(CZYTELNIK_ID=ID) in=w
- where=(DATA_ODDANIA=.) )
- b.CZYTELNIK (in=c);
- by ID;
- if c=w;
- keep CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;
- run;
- /*-------------------------------------------------------------*/
- /*1*/
- /*wybrac top 5 czytelników z największą liczbą wypożyczeń*/
- data b.top_5;
- set b.wypozyczenia;
- by czytelnik_id;
- if first.czytelnik_id then
- licz_ks=0;
- licz_ks +1;
- if last.czytelnik_id;
- keep czytelnik_id licz_ks;
- run;
- proc sort data=b.top_5;
- by descending licz_ks;
- run;
- data b.top_5;
- set b.top_5;
- /*if _N_<=5 then output;*/
- if _N_=5 then
- call symput('top5'licz_ks);
- run;
- data b.top_5;
- set b.top_5;
- if _N_ <= or licz_ks>= &top5.;
- run;
- /*połącz z tabelą czytelnik - imie, nazwisko, adres */
- proc sort data=b.top_5;
- by czytelnik_id;
- run;
- data b.top5_czytelnicy;
- merge b.CZYTELNIK (in=c)
- b.top_5(in=t rename=(czytelnik_id=id));
- by ID;
- if c=t;
- keep CZYTELNIK_IMIE CZYTELNIK_NAZWISKO ADRES licz_ks;
- run;
- /*na podstawie imienia tab:CZYTELNIK ustalić płeć czytelników i zliczyć czytelników w podziale ma płci*/
- data b.plec;
- set b.CZYTELNIK;
- if substr(CZYTELNIK_IMIE,length(CZYTELNIK_IMIE),1)='a' then
- plec='K';
- else plec='M';
- keep id czytelnik_imie plec;
- run;
- /*zliczyć ile k i ile m*/
- /*************************************/
- /*SAS SQL*/
- proc sql;
- create table b.czytelnik_gdynia as
- select *
- from b.czytelnik
- where ADRES='Gdynia';
- /*quit*/
- /*case - when*/
- proc sql;
- create table b.podzial_ksiazek as
- select AUTOR_NAZWISKO, TYTUL, ROK_WYDANIA,
- case
- when ROK_WYDANIA<=1980 then 'starsze'
- when ROK_WYDANIA<=2000 then 'współczesne'
- else 'najnowsze'
- end
- as kategoria
- from b.ksiazka;
- /*ustal najdroższą książkę w tabeli, podaj tytuł, autora i cenę*/
- /*a*/
- proc sql;
- select AUTOR_NAZWISKO, TYTUL, cena
- from b.KSIAZKA
- where cena= ( select max(cena) from b.KSIAZKA);
- /*b*/
- proc sql;
- select AUTOR_NAZWISKO, TYTUL, cena
- from b.KSIAZKA
- having cena=max(cena);
- /*c*/
- proc sql outobs=1;;
- select AUTOR_NAZWISKO, TYTUL, cena
- from b.KSIAZKA
- order by cena desc;
- /*ustal liczbę czytelników w każdym z miast i podaj udział procentowy (miast, liczba czytelników, udział procentowy)*/
- /*a*/
- proc sql;
- create table b.udzial_czytelnikow as
- select ADRES,
- count(*)/(select count(*) from b.czytelnik) as udzial_pct
- format percent8.2
- from b.czytelnik
- group by /*ADRES*/
- 1;
- /*b*/
- proc sql;
- create table b.udzial_czytelnikow as
- select ADRES, count(*) as liczba_czytelnikow,
- (select count(*) from b.czytelnik) as total,
- (calculated liczba_czytelnikow)/(calculated total) as udzial_pct
- format percent8.2
- from b.czytelnik
- group by /*ADRES*/
- 1;
- /**********************czwarty zjazd***********************/
- /*1*/
- /*dla każdego czytelnik ID, wyznacz ilosc wypozyczonych ksiazek w poszczegolnych kwartałach 2007 roku*/
- /*w tabeli chcemy 5 kolumn: id czytelnika, wyp_kw_1, wyp_kw_2, wyp_kw_3, wyp_kw_4*/
- proc sql;
- create table b.wyp_2007 as
- select CZYTELNIK_ID, qtr(DATA_WYPOZYCZENIA) as kwartal,
- count(*) as liczba_wypozyczen
- from b.wypozyczenia
- group by 1,2;
- proc sql;
- create table b.wyp_2007_v2 as
- select CZYTELNIK_ID,
- sum(qtr(DATA_WYPOZYCZENIA)=1) as kwartal_1,
- sum(qtr(DATA_WYPOZYCZENIA)=2) as kwartal_2,
- sum(qtr(DATA_WYPOZYCZENIA)=3) as kwartal_3,
- sum(qtr(DATA_WYPOZYCZENIA)=4) as kwartal_4
- from b.wypozyczenia
- group by 1;
- /*2*/
- /*ustal czytelnikow ktorzy posiadali nieoddane ksiazki na dzien 1 pazdziernika 2007 roku*/
- proc sql;
- create table b.nieoddane_01_10_2007 as
- select *
- from b.wypozyczenia
- where DATA_WYPOZYCZENIA<'01OCT2007'd and
- (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA is null);
- /*v2*/
- proc sql;
- create table b.nieoddane_01_10_2007 as
- select *
- from b.wypozyczenia
- where DATA_WYPOZYCZENIA<'01OCT2007'd and
- (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA =.);
- /*3*/
- /*na podstawie tabeli ksiazka utworz kolumne nowa_cena ktora stanowi 90% ceny dla ksiazek wydanych po 2000 (wlacznie) roku i 50% ceny dla ksiazek wydanych przed 2000*/
- proc sql;
- create table b.ksiazka_cena as
- select *,
- case
- when ROK_WYDANIA>=2000 then cena*0.9
- else cena *0.5
- end
- as nowa_cena
- from b.ksiazka;
- /*4*/
- /*podaj liczbe wydanych ksiazek przed rokiem 2000 i po 2000 wlacznie*/
- proc sql;
- create table b.ksiazki_przed_po_2000 as
- select
- sum(ROK_WYDANIA<2000) as wydane_przed_2000,
- sum(ROK_WYDANIA>=2000) as wydane_po_2000
- from b.ksiazka;
- /*v2*/
- proc sql;
- create table b.ksiazki_przed_po_2000 as
- select
- case
- when ROK_WYDANIA<2000 then 'przed 2000'
- else 'po 2000'
- end
- as wydane_2000,
- count(*) as liczba_ksiazek
- from b.ksiazka
- group by wydane_2000;
- /*5*/
- /*podaj wszystkie ksiazki wypozyczone przez czytelnikow z gdanska*/
- proc sql;
- create table b.wypozyczenia_gdansk as
- select *
- from b.wypozyczenia
- where CZYTELNIK_ID in (select ID from b.czytelnik
- where ADRES='Gdańsk');
- /*v2*/
- proc sql;
- create table b.wypozyczenia_gdansk as
- select w.*, c.ADRES
- from b.wypozyczenia as w inner join b.czytelnik as c
- on w.CZYTELNIK_ID = c.ID
- where c.ADRES='Gdańsk'
- order by w.CZYTELNIK_ID;
- /*v3*/
- proc sql;
- create table b.wypozyczenia_gdansk as
- select w.*, c.ADRES
- from b.wypozyczenia as w, b.czytelnik as c
- where w.CZYTELNIK_ID=c.ID
- and c.ADRES='Gdańsk'
- order by w.CZYTELNIK_ID;
- /*6*/
- /*podaj 10 czytelnikow z najwieksza liczba wypozyczen (imie, nazwisko, adres i liczbe wypozyczen)*/
- proc sql outobs=10;
- create table b.wypozyczenia_by_czyt as
- select CZYTELNIK_ID, count(*) as liczba_wypozyczen
- from b.wypozyczenia
- group by 1
- order by 2 desc;
- /*v2*/
- proc sql;
- create table b.top_10 as
- select w.*, c.ADRES, c.CZYTELNIK_IMIE, c.CZYTELNIK_NAZWISKO
- from b.wypozyczenia_by_czyt as w inner join b.czytelnik as c
- on w.CZYTELNIK_ID=c.ID
- order by 4 desc;
- /*przyklady*/
- /*
- 1. podaj liczbe ksiazek w podziale na gatunek
- 2. zidentyfikuj czytlenikow ktorzy nie oddali ksiazek, przedstaw wynik w podziale na miasta
- 3. podaj liczbe wypozyczonych ksiazek w podziale na miasto czytelnika
- 4. podaj udzial procentowy kobiet i mezczyzn na podstawie tabeli czytelnik
- 5. podaj 3 najczesciej wypozyczane ksiazki : w tabeli podaj autora, tytul i liczbe wypozyczen
- 6. czytelnicy z jakiego miasta nie oddali najwiecej ksiazek
- 7. ustal staz czytelnikow na podstawie daty zapisu do biblioteki
- 8. ustal 5 najtanszych ksiazek oraz liczbe ich wypozyczen
- 9. ustal wartosc ksiegozbioru w podziale na gatunki i okresl udzial procentowy
- 10. podaj czytelnikow ktorzy nie dokonali wypozyczenia w 2007 roku
- */
- /*--SAS 4GL--*/
- /*1*/
- proc sort data=b.ksiazka
- out=b.ksiazka_sort/*(keep = gatunek)*/;
- by gatunek;
- run;
- data s.l_ksiazek;
- set b.ksiazka_sort;
- by gatunek;
- if first.gatunek then
- liczba_ksiazek=0;
- liczba_ksiazek + 1;
- if last.gatunek;
- keep gatunek liczba_ksiazek;
- run;
- /*2*/
- data b.nieoddane;
- /*retain CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;*/
- merge
- b.WYPOZYCZENIA (rename=(CZYTELNIK_ID=ID) in=w
- where=(DATA_ODDANIA=.) )
- b.CZYTELNIK (in=c);
- by ID;
- if c=w;
- keep ADRES;
- run;
- proc sort data=b.nieoddane;
- by adres;
- run;
- data s.nieoddane_group;
- set b.nieoddane;
- by adres;
- if first.adres then
- liczba_nieoddanych=0;
- liczba_nieoddanych + 1;
- if last.adres;
- keep adres liczba_nieoddanych;
- run;
- /*3*/
- data b.wypozyczone;
- /*retain CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;*/
- merge
- b.WYPOZYCZENIA (rename=(CZYTELNIK_ID=ID) in=w)
- b.CZYTELNIK (in=c);
- by ID;
- if c=w;
- keep ADRES;
- run;
- proc sort data=b.wypozyczone;
- by adres;
- run;
- data s.wypozyczone_group;
- set b.wypozyczone;
- by adres;
- if first.adres then
- liczba_wypozyczonych=0;
- liczba_wypozyczonych + 1;
- if last.adres;
- keep adres liczba_wypozyczonych;
- run;
- /*4*/
- data b.plec;
- set b.CZYTELNIK;
- if substr(CZYTELNIK_IMIE,length(CZYTELNIK_IMIE),1)='a' then
- plec='K';
- else plec='M';
- keep id czytelnik_imie plec;
- run;
- proc sql;
- create table b.udzial_plci as
- select plec,
- count(*)/(select count(*) from b.plec) as udzial_pct
- format percent8.2
- from b.plec
- group by plec;
- /*5*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement