Advertisement
Guest User

sas4gl

a guest
Dec 1st, 2018
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SAS 13.22 KB | None | 0 0
  1. /* tworzenie biblioteki */
  2. libname s "/folders/myfolders" inencoding=any;
  3.  
  4. /* SAS 4GL - przetwarzanie wierszowe */
  5. /*1*/
  6.  
  7. /* pobierz dane z tabeli sashelp.CARS, dokonując selekcji wierszy
  8. tylko dla pojazdów Audi */
  9. data s._123AUDI ; /* data- uwtórz tabelę */
  10.     set sashelp.cars ; /* set- pobierz z*/
  11.     where make='Audi';
  12. run ; /* znacznik konca bloku kodu */
  13.  
  14. /* 2 */
  15.  
  16. /* wybierz audi lub bmw oraz zachowaj tylko
  17. kolumny make, model, invoice */
  18. data s.audi_bmw; /*(keep=make Model Invoice)*/
  19.     ;
  20.     set sashelp.cars;
  21.     where make ='Audi' or make='BMW';
  22.  
  23.     /*where make in ('Audi', 'BMW');*/
  24.     keep make Model Invoice; /*drop */
  25. run;
  26.  
  27. /* 3 */
  28.  
  29. /* znajdz najdrozsze auto w tabeli, na podstawie
  30. kolumny invoice */
  31.  
  32. /* najpierw sortowanie */
  33. proc sort data=sashelp.cars  
  34.     out=s.cars_sort (keep=make Model Invoice);
  35.     by descending invoice;
  36. run;
  37.  
  38. data s.cars_sort;
  39.     set s.cars_sort;
  40.  
  41.     IF _N_<=5 ; /*_N_ - numerator */
  42. run;
  43.  
  44. /* 4*/
  45.  
  46. /* jak zliczyć wartosc wszystkich pojazdów
  47. w tabeli cars */
  48. data  s.wartosc_cars;
  49.     set sashelp.cars end=koniec;
  50.  
  51.     /* znacznik konca tabeli*/
  52.     wartosc+invoice;
  53.     keep make model wartosc invoice;
  54.  
  55.     if koniec then
  56.         output;
  57.  
  58.     /* zrzucę ostatni wiersz w tabeli*/
  59. run;
  60.  
  61. /* 5 */
  62. /* przetwarzanie w grupach */
  63. /* podaj liczbę pojazdów w podziale na markę */
  64. data s.liczba_pojazdow;
  65.     set sashelp.cars;
  66.     by make ; /* group by */
  67.  
  68.     /* uwaga - dane musza być posortowane
  69.     wg danej kolumny*/
  70.     if first.make then
  71.         liczba_pojazdow=0;
  72.     liczba_pojazdow + 1;
  73.  
  74.     if last.make then
  75.         output;
  76.  
  77.     /*if last.make;*/
  78.     keep make liczba_pojazdow;
  79. run;
  80.  
  81. /* 6 */
  82. /* grupowanie */
  83. /* podaj wartosc pojazdów w podziale na markę */
  84. data s.wartosc_pojazdow;
  85.     set sashelp.cars;
  86.     by make;
  87.  
  88.     if first.make then
  89.         wartosc_pojazdow=0;
  90.     wartosc_pojazdow + invoice;
  91.  
  92.     if last.make then
  93.         output;
  94.     keep make wartosc_pojazdow;
  95. run;
  96.  
  97. /*7*/
  98. /* podaj ilosc i wartosc */
  99. data s.wartosc_pojazdow;
  100.     set sashelp.cars;
  101.     by make;
  102.  
  103.     if first.make then
  104.         do;
  105.             liczba_pojazdow =0;
  106.             wartosc_pojazdow=0;
  107.         end;
  108.  
  109.     liczba_pojazdow + 1;
  110.     wartosc_pojazdow + invoice;
  111.  
  112.     if last.make then
  113.         output;
  114.     keep make wartosc_pojazdow liczba_pojazdow;
  115. run;
  116.  
  117. /*******************************************/
  118. /* 07/10/2018 */
  119. /*******************************************/
  120.  
  121. /* 1*/
  122. /* if then else */
  123.  
  124. /* na podstawie kol. invoice
  125. chcemy podzielić pojazdy na kategorie*/
  126. data s.kategoria_cenowa;
  127.     set sashelp.cars;
  128.     length kategoria $7;
  129.  
  130.     if invoice<30000 then
  131.         kategoria='tanie';
  132.     else if invoice<60000 then
  133.         kategoria='średnia';
  134.     else kategoria='drogie';
  135.     keep make Model Invoice kategoria;
  136. run;
  137.  
  138. /* 2*/
  139.  
  140. /* na podstawie tabeli kategoria_cenowa zlicz pojazdy
  141. w kazdej kategorii cenowej */
  142. proc sort data= s.kategoria_cenowa;
  143.     by kategoria;
  144. run;
  145.  
  146. data s.kategoria_cenowa_zlicz;
  147.     set s.kategoria_cenowa;
  148.     by kategoria;
  149.  
  150.     if first.kategoria then
  151.         licz_pojazdy=0;
  152.     licz_pojazdy +1;
  153.  
  154.     if last.kategoria;
  155.     keep kategoria licz_pojazdy;
  156. run;
  157.  
  158. /* 3 */
  159.  
  160. /* na podstawie kolumny invoice utwórz nową kolumnę nowa_cena,
  161. która stanowi 90% wartość invoice,
  162. nową cenę zaokrąglić do mc setnych */
  163. data s.nowa_cena;
  164.     set sashelp.cars;
  165.     nowa_cena =  ROUND(invoice * 0.9, 0.01);
  166.     keep make model Invoice nowa_cena;
  167.     format nowa_cena dollar20.2;
  168. run;
  169.  
  170. /* daty w SAS */
  171. /* 4 */
  172. data s.daty;
  173.     dzis=today();
  174.     format dzis ddmmyy10.;
  175.  
  176.     /*format dzis date9.;*/
  177.     wiek = dzis - '25JAN1995'd;
  178.     dzien=day(dzis);
  179.     dzien_tyg=weekday(dzis);
  180.     mies=month(dzis);
  181.     tydz=week(dzis);
  182.     kw=qtr(dzis);
  183. run;
  184.  
  185. /******************************************/
  186. /* Łączenie tabel */
  187. /******************************************/
  188. /* wygenerujemy przykąłdowe tabele */
  189. data s.tabela_A;
  190.     do id=1 to 1000;
  191.         kolumna_A='ABC';
  192.         output;
  193.     end;
  194. run;
  195.  
  196. data s.tabela_B;
  197.     do identyfikator=1 to 1500 by 10;
  198.         kolumna_B='BBB';
  199.         output;
  200.     end;
  201. run;
  202.  
  203. /*  * klucz do łączenia musi miec tę samą nazwę */
  204.  
  205. /*  * tabele do łaczenia musza byc w ten sam sposób
  206. posortowane po kolumnie kluczu */
  207.  
  208. /*  * merge - łączenie  */
  209. proc  sort data=s.tabela_A;
  210.     by id;
  211. run;
  212.  
  213. proc  sort data=s.tabela_B;
  214.     by identyfikator;
  215. run;
  216.  
  217. data s.merged;
  218.     merge s.tabela_A (in=a)
  219.         s.tabela_B (rename=(identyfikator=ID) in=b );
  220.     by id ; /* kolumna do łaczenia*/
  221.  
  222.     if a=b /* lub a=1 and b=1 */
  223.  
  224.     ;  /* mechanizm łaczenia */
  225. run;
  226.  
  227. /**********************************/
  228. /* dane bibiloteka */
  229. libname b "/folders/myfolders" inencoding=any;
  230.  
  231. /* ustal czytelników, którzy nie oddali ksiazki */
  232. /* ustal imie, nazwisko, miasto czytelnika */
  233. proc  sort data=b.CZYTELNIK;
  234.     by id;
  235. run;
  236.  
  237. proc  sort data=b.WYPOZYCZENIA;
  238.     by CZYTELNIK_ID;
  239. run;
  240.  
  241. data b.czarna_lista;
  242.     retain CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;
  243.     merge
  244.         b.WYPOZYCZENIA (rename=(CZYTELNIK_ID=ID) in=w  
  245.         where=(DATA_ODDANIA=.)   )
  246.         b.CZYTELNIK (in=c);
  247.     by ID;
  248.  
  249.     if c=w;
  250.     keep CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;
  251. run;
  252.  
  253. /*-------------------------------------------------------------*/
  254. /*1*/
  255. /*wybrac top 5 czytelników z największą liczbą wypożyczeń*/
  256. data b.top_5;
  257.     set b.wypozyczenia;
  258.     by czytelnik_id;
  259.  
  260.     if first.czytelnik_id then
  261.         licz_ks=0;
  262.     licz_ks +1;
  263.  
  264.     if last.czytelnik_id;
  265.     keep czytelnik_id licz_ks;
  266. run;
  267.  
  268. proc sort data=b.top_5;
  269.     by descending licz_ks;
  270. run;
  271.  
  272. data b.top_5;
  273.     set b.top_5;
  274.  
  275.     /*if _N_<=5 then output;*/
  276.     if _N_=5 then
  277.         call symput('top5'licz_ks);
  278. run;
  279.  
  280. data b.top_5;
  281.     set b.top_5;
  282.  
  283.     if _N_ <= or licz_ks>= &top5.;
  284. run;
  285.  
  286. /*połącz z tabelą czytelnik - imie, nazwisko, adres */
  287. proc sort data=b.top_5;
  288.     by czytelnik_id;
  289. run;
  290.  
  291. data b.top5_czytelnicy;
  292.     merge b.CZYTELNIK (in=c)
  293.         b.top_5(in=t rename=(czytelnik_id=id));
  294.     by ID;
  295.  
  296.     if c=t;
  297.     keep CZYTELNIK_IMIE CZYTELNIK_NAZWISKO ADRES licz_ks;
  298. run;
  299.  
  300. /*na podstawie imienia tab:CZYTELNIK ustalić płeć czytelników i zliczyć czytelników w podziale ma płci*/
  301. data b.plec;
  302.     set b.CZYTELNIK;
  303.  
  304.     if substr(CZYTELNIK_IMIE,length(CZYTELNIK_IMIE),1)='a' then
  305.         plec='K';
  306.     else plec='M';
  307.     keep id czytelnik_imie plec;
  308. run;
  309.  
  310. /*zliczyć ile k i ile m*/
  311. /*************************************/
  312. /*SAS SQL*/
  313. proc sql;
  314.     create table b.czytelnik_gdynia as
  315.         select *
  316.             from b.czytelnik
  317.                 where ADRES='Gdynia';
  318.  
  319.     /*quit*/
  320.     /*case - when*/
  321. proc sql;
  322.     create table b.podzial_ksiazek as
  323.         select AUTOR_NAZWISKO, TYTUL, ROK_WYDANIA,
  324.             case
  325.                 when ROK_WYDANIA<=1980 then 'starsze'
  326.                 when ROK_WYDANIA<=2000 then 'współczesne'
  327.                 else 'najnowsze'
  328.             end
  329.         as kategoria
  330.             from b.ksiazka;
  331.  
  332.     /*ustal najdroższą książkę w tabeli, podaj tytuł, autora i cenę*/
  333.     /*a*/
  334. proc sql;
  335.     select AUTOR_NAZWISKO, TYTUL, cena
  336.         from b.KSIAZKA
  337.             where cena= ( select max(cena) from b.KSIAZKA);
  338.  
  339.     /*b*/
  340. proc sql;
  341.     select AUTOR_NAZWISKO, TYTUL, cena
  342.         from b.KSIAZKA
  343.             having cena=max(cena);
  344.  
  345.     /*c*/
  346. proc sql outobs=1;;
  347.     select AUTOR_NAZWISKO, TYTUL, cena
  348.         from b.KSIAZKA
  349.             order by cena desc;
  350.  
  351.     /*ustal liczbę czytelników w każdym z miast i podaj udział procentowy (miast, liczba czytelników, udział procentowy)*/
  352.     /*a*/
  353. proc sql;
  354.     create table b.udzial_czytelnikow as
  355.         select ADRES,
  356.             count(*)/(select count(*) from b.czytelnik) as udzial_pct
  357.             format percent8.2
  358.         from b.czytelnik
  359.             group by /*ADRES*/
  360.     1;
  361.     /*b*/
  362. proc sql;
  363.     create table b.udzial_czytelnikow as
  364.         select ADRES, count(*) as liczba_czytelnikow,
  365.         (select count(*) from b.czytelnik) as total,
  366.             (calculated liczba_czytelnikow)/(calculated total) as udzial_pct
  367.             format percent8.2
  368.         from b.czytelnik
  369.             group by /*ADRES*/
  370.     1;
  371.     /**********************czwarty zjazd***********************/
  372.     /*1*/
  373.     /*dla każdego czytelnik ID, wyznacz ilosc wypozyczonych ksiazek w poszczegolnych kwartałach 2007 roku*/
  374.     /*w tabeli chcemy 5 kolumn: id czytelnika, wyp_kw_1, wyp_kw_2, wyp_kw_3, wyp_kw_4*/
  375. proc sql;
  376.     create table b.wyp_2007 as
  377.         select CZYTELNIK_ID, qtr(DATA_WYPOZYCZENIA) as kwartal,
  378.             count(*) as liczba_wypozyczen
  379.         from b.wypozyczenia
  380.             group by 1,2;
  381.  
  382. proc sql;
  383.     create table b.wyp_2007_v2 as
  384.         select CZYTELNIK_ID,
  385.             sum(qtr(DATA_WYPOZYCZENIA)=1) as kwartal_1,
  386.             sum(qtr(DATA_WYPOZYCZENIA)=2) as kwartal_2,
  387.             sum(qtr(DATA_WYPOZYCZENIA)=3) as kwartal_3,
  388.             sum(qtr(DATA_WYPOZYCZENIA)=4) as kwartal_4
  389.         from b.wypozyczenia
  390.             group by 1;
  391.  
  392.     /*2*/
  393.     /*ustal czytelnikow ktorzy posiadali nieoddane ksiazki na dzien 1 pazdziernika 2007 roku*/
  394. proc sql;
  395.     create table b.nieoddane_01_10_2007 as
  396.         select *
  397.             from b.wypozyczenia
  398.                 where DATA_WYPOZYCZENIA<'01OCT2007'd and
  399.                     (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA is null);
  400.  
  401.     /*v2*/
  402. proc sql;
  403.     create table b.nieoddane_01_10_2007 as
  404.         select *
  405.             from b.wypozyczenia
  406.                 where DATA_WYPOZYCZENIA<'01OCT2007'd and
  407.                     (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA =.);
  408.  
  409.     /*3*/
  410.     /*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*/
  411. proc sql;
  412.     create table b.ksiazka_cena as
  413.         select *,
  414.             case
  415.                 when ROK_WYDANIA>=2000 then cena*0.9
  416.                 else cena *0.5
  417.             end
  418.         as nowa_cena
  419.             from b.ksiazka;
  420.  
  421.     /*4*/
  422.     /*podaj liczbe wydanych ksiazek przed rokiem 2000 i po 2000 wlacznie*/
  423. proc sql;
  424.     create table b.ksiazki_przed_po_2000 as
  425.         select
  426.             sum(ROK_WYDANIA<2000) as wydane_przed_2000,
  427.             sum(ROK_WYDANIA>=2000) as wydane_po_2000
  428.         from b.ksiazka;
  429.  
  430.     /*v2*/
  431. proc sql;
  432.     create table b.ksiazki_przed_po_2000 as
  433.         select
  434.             case
  435.                 when ROK_WYDANIA<2000 then 'przed 2000'
  436.                 else 'po 2000'
  437.             end
  438.         as wydane_2000,
  439.             count(*) as liczba_ksiazek
  440.         from b.ksiazka
  441.             group by wydane_2000;
  442.  
  443.     /*5*/
  444.     /*podaj wszystkie ksiazki wypozyczone przez czytelnikow z gdanska*/
  445. proc sql;
  446.     create table b.wypozyczenia_gdansk as
  447.         select *
  448.             from b.wypozyczenia
  449.                 where CZYTELNIK_ID in (select ID from b.czytelnik
  450.                 where ADRES='Gdańsk');
  451.  
  452.     /*v2*/
  453. proc sql;
  454.     create table b.wypozyczenia_gdansk as
  455.         select w.*, c.ADRES
  456.             from b.wypozyczenia as w inner join b.czytelnik as c
  457.                 on w.CZYTELNIK_ID = c.ID
  458.             where c.ADRES='Gdańsk'
  459.                 order by w.CZYTELNIK_ID;
  460.  
  461.     /*v3*/
  462. proc sql;
  463.     create table b.wypozyczenia_gdansk as
  464.         select w.*, c.ADRES
  465.             from b.wypozyczenia as w, b.czytelnik as c
  466.                 where w.CZYTELNIK_ID=c.ID
  467.                     and c.ADRES='Gdańsk'
  468.                 order by w.CZYTELNIK_ID;
  469.  
  470.     /*6*/
  471.     /*podaj 10 czytelnikow z najwieksza liczba wypozyczen (imie, nazwisko, adres i liczbe wypozyczen)*/
  472. proc sql outobs=10;
  473.     create table b.wypozyczenia_by_czyt as
  474.         select CZYTELNIK_ID, count(*) as liczba_wypozyczen
  475.             from b.wypozyczenia
  476.                 group by 1
  477.                     order by 2 desc;
  478.  
  479.     /*v2*/
  480. proc sql;
  481.     create table b.top_10 as
  482.         select w.*, c.ADRES, c.CZYTELNIK_IMIE, c.CZYTELNIK_NAZWISKO
  483.             from b.wypozyczenia_by_czyt as w inner join b.czytelnik as c
  484.                 on w.CZYTELNIK_ID=c.ID
  485.                     order by 4 desc;
  486.  
  487.  
  488.                 /*przyklady*/
  489.  
  490.     /*
  491.     1. podaj liczbe ksiazek w podziale na gatunek
  492.     2. zidentyfikuj czytlenikow ktorzy nie oddali ksiazek, przedstaw wynik w podziale na miasta
  493.     3. podaj liczbe wypozyczonych ksiazek w podziale na miasto czytelnika
  494.     4. podaj udzial procentowy kobiet i mezczyzn na podstawie tabeli czytelnik
  495.     5. podaj 3 najczesciej wypozyczane ksiazki : w tabeli podaj autora, tytul i liczbe wypozyczen
  496.     6. czytelnicy z jakiego miasta nie oddali najwiecej ksiazek
  497.     7. ustal staz czytelnikow na podstawie daty zapisu do biblioteki
  498.     8. ustal 5 najtanszych ksiazek oraz liczbe ich wypozyczen
  499.     9. ustal wartosc ksiegozbioru w podziale na gatunki i okresl udzial procentowy
  500.     10. podaj czytelnikow ktorzy nie dokonali wypozyczenia w 2007 roku
  501.     */
  502.    
  503.     /*--SAS 4GL--*/
  504.     /*1*/
  505.    
  506.     proc sort data=b.ksiazka
  507.         out=b.ksiazka_sort/*(keep = gatunek)*/;
  508.         by gatunek;
  509.     run;
  510.    
  511.     data s.l_ksiazek;
  512.     set b.ksiazka_sort;
  513.     by gatunek;
  514.    
  515.     if first.gatunek then
  516.         liczba_ksiazek=0;
  517.     liczba_ksiazek + 1;
  518.  
  519.     if last.gatunek;
  520.  
  521.     keep gatunek liczba_ksiazek;
  522.     run;
  523.    
  524.     /*2*/
  525.    
  526.     data b.nieoddane;
  527.     /*retain CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;*/
  528.     merge
  529.         b.WYPOZYCZENIA (rename=(CZYTELNIK_ID=ID) in=w  
  530.         where=(DATA_ODDANIA=.)   )
  531.         b.CZYTELNIK (in=c);
  532.     by ID;
  533.  
  534.     if c=w;
  535.     keep ADRES;
  536. run;
  537.  
  538.     proc sort data=b.nieoddane;
  539.         by adres;
  540.     run;
  541.    
  542.    
  543.     data s.nieoddane_group;
  544.     set b.nieoddane;
  545.     by adres;
  546.    
  547.     if first.adres then
  548.         liczba_nieoddanych=0;
  549.     liczba_nieoddanych + 1;
  550.  
  551.     if last.adres;
  552.  
  553.     keep adres liczba_nieoddanych;
  554.     run;
  555.    
  556.    
  557.     /*3*/
  558.     data b.wypozyczone;
  559.     /*retain CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;*/
  560.     merge
  561.         b.WYPOZYCZENIA (rename=(CZYTELNIK_ID=ID) in=w)  
  562.         b.CZYTELNIK (in=c);
  563.     by ID;
  564.  
  565.     if c=w;
  566.     keep ADRES;
  567.     run;
  568.  
  569.     proc sort data=b.wypozyczone;
  570.         by adres;
  571.     run;
  572.    
  573.    
  574.     data s.wypozyczone_group;
  575.     set b.wypozyczone;
  576.     by adres;
  577.    
  578.     if first.adres then
  579.         liczba_wypozyczonych=0;
  580.     liczba_wypozyczonych + 1;
  581.  
  582.     if last.adres;
  583.  
  584.     keep adres liczba_wypozyczonych;
  585.     run;
  586.    
  587.     /*4*/
  588.    
  589.     data b.plec;
  590.     set b.CZYTELNIK;
  591.  
  592.     if substr(CZYTELNIK_IMIE,length(CZYTELNIK_IMIE),1)='a' then
  593.         plec='K';
  594.     else plec='M';
  595.     keep id czytelnik_imie plec;
  596.     run;
  597.    
  598.     proc sql;
  599.     create table b.udzial_plci as
  600.         select plec,
  601.             count(*)/(select count(*) from b.plec) as udzial_pct
  602.             format percent8.2
  603.         from b.plec
  604.         group by plec;
  605.  
  606. /*5*/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement