Guest User

Untitled

a guest
Dec 16th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.85 KB | None | 0 0
  1. /* tworzenie biblioteki */
  2. libname s "C:\Users\Student.WZIM\Desktop\SBI" ;
  3.  
  4. /* SAS 4GL - przetwarzanie wierszowe */
  5.  
  6. /*1*/
  7. /* pobierz dane z tabeli CARS, dokonuj�c selekcji wierszy
  8. tylko dla pojazd�w Audi */
  9.  
  10. data s.AUDI ; /* data- uwt�rz tabel� */
  11. set sashelp.cars ; /* set- pobierz z*/
  12. where make='Audi' ;
  13. run ; /* znacznik konca bloku kodu */
  14.  
  15. /* 2 */
  16. /* wybierz audi lub bmw oraz zachowaj tylko
  17. kolumny make, model, invoice */
  18. data s.audi_bmw; /*(keep=make Model Invoice)*/ ;
  19. set sashelp.cars ;
  20. where make ='Audi' or make='BMW';
  21. /*where make in ('Audi', 'BMW');*/
  22. keep make Model Invoice; /*drop */
  23. run;
  24.  
  25. /* 3 */
  26. /* znajdz najdrozsze auto w tabeli, na podstawie
  27. kolumny invoice */
  28. /* najpierw sortowanie */
  29. proc sort data=sashelp.cars
  30. out=s.cars_sort (keep=make Model Invoice);
  31. by descending invoice;
  32. run;
  33.  
  34. data s.cars_sort;
  35. set s.cars_sort ;
  36. IF _N_<=5 ; /*_N_ - numerator */
  37. run;
  38.  
  39. /* 4*/
  40. /* jak zliczy� wartosc wszystkich pojazd�w
  41. w tabeli cars */
  42. data s.wartosc_cars ;
  43. set sashelp.cars end=koniec ;
  44. /* znacznik konca tabeli*/
  45. wartosc+invoice;
  46. keep make model wartosc invoice;
  47. if koniec then output;
  48. /* zrzuc� ostatni wiersz w tabeli*/
  49. run;
  50. /* 5 */
  51. /* przetwarzanie w grupach */
  52. /* podaj liczb� pojazd�w w podziale na mark� */
  53. data s.liczba_pojazdow ;
  54. set sashelp.cars ;
  55. by make ; /* group by */
  56. /* uwaga - dane musza by� posortowane
  57. wg danej kolumny*/
  58. if first.make then liczba_pojazdow=0;
  59. liczba_pojazdow + 1;
  60. if last.make then output;
  61. /*if last.make;*/
  62. keep make liczba_pojazdow ;
  63. run;
  64.  
  65. /* 6 */
  66. /* grupowanie */
  67. /* podaj wartosc pojazd�w w podziale na mark� */
  68.  
  69. data s.wartosc_pojazdow ;
  70. set sashelp.cars ;
  71. by make ;
  72. if first.make then wartosc_pojazdow=0;
  73. wartosc_pojazdow + invoice;
  74. if last.make then output;
  75. keep make wartosc_pojazdow ;
  76. run;
  77. /*7*/
  78. /* podaj ilosc i wartosc */
  79.  
  80. data s.wartosc_pojazdow ;
  81. set sashelp.cars ;
  82. by make ;
  83. if first.make then do ;
  84. liczba_pojazdow =0;
  85. wartosc_pojazdow=0;
  86. end;
  87. liczba_pojazdow + 1;
  88. wartosc_pojazdow + invoice;
  89. if last.make then output;
  90. keep make wartosc_pojazdow liczba_pojazdow ;
  91. run;
  92.  
  93.  
  94.  
  95. /**********************************************************/
  96. /*07/10/2018*/
  97.  
  98.  
  99. /*1*/
  100. /* if then else*/
  101. /* na podstawie kolumny invoice chcemy podzieli� pojazdy na kategorie*/
  102. data s.kategoria_cenowa;
  103. set sashelp.cars;
  104. length kategoria $7;
  105. if invoice<30000 then kategoria='tanie';
  106. else if invoice<60000 then kategoria='srednia';
  107. else kategoria='drogie';
  108. keep Make Model Invoice kategoria;
  109. run;
  110.  
  111.  
  112.  
  113.  
  114.  
  115. /*2*/
  116. /* na podstawie tabeli kategoria cenowa zlicz pojazdy w ka�dej kategorii */
  117.  
  118. /*najpierw sortowanie*/
  119. proc sort data=s.kategoria_cenowa;
  120. by kategoria;
  121. run;
  122.  
  123.  
  124. data s.ilosc_w_kategorii;
  125. set s.kategoria_cenowa;
  126. by kategoria;
  127.  
  128. if first.kategoria then do ;
  129. liczba_w_kategorii=0;
  130. end;
  131. liczba_w_kategorii + 1;
  132. if last.kategoria then output;
  133. keep kategoria liczba_w_kategorii;
  134. run;
  135.  
  136.  
  137.  
  138. /*3*/
  139. /*na podstawie kolumny invoice utw�rz now� kolumn� nowa_cena kt�ra stanowi 90% wartos�i invoice,
  140. now� cen� zaokr�gli� do mc setnych*/
  141.  
  142. data s.nowa_cena;
  143. set sashelp.cars;
  144. nowa_cena = round(invoice * 0.9, 0.01);
  145. keep Make Model Invoice nowa_cena;
  146. format nowa_cena dollar10.2;
  147. run;
  148.  
  149.  
  150. /*4*/
  151. /* daty w sas */
  152.  
  153.  
  154. data s.daty;
  155. dzis=today();
  156. format dzis ddmmyy10.;
  157. /*format dzis date9.;*/
  158. wiek = dzis - '18DEC1990'd;
  159.  
  160. dzien=day(dzis);
  161. dzien_tyg=weekday(dzis);
  162. mies=month(dzis);
  163. tydz=week(dzis);
  164. kwartal=qtr(dzis);
  165.  
  166. run;
  167.  
  168.  
  169. /************************************************/
  170. /* ��czenie tabel */
  171. /***********************************************/
  172.  
  173. /* wygenerujemy przyk�adowe table */
  174. data s.tabela_A;
  175. do id=1 to 1000;
  176. kolumna_A='ABC';
  177. output;
  178. end;
  179. run;
  180.  
  181. data s.tabela_B;
  182. do identyfikator=1 to 1500 by 10;
  183. kolumna_B='BBB';
  184. output;
  185. end;
  186. run;
  187.  
  188.  
  189. /* **klucz do ��czenia musi mie� t� sam� nazw� */
  190. /* tabele do ��czenie musz� by� w ten sam spos�b posortowane po kolumnie kluczu */
  191. /* merge - ��czenie */
  192.  
  193. proc sort data=s.tabela_a;
  194. by id;
  195. run;
  196. proc sort data=s.tabela_b;
  197. by identyfikator;
  198. run;
  199.  
  200.  
  201. data s.merged;
  202. merge s.tabela_a (in=a)
  203. s.tabela_b (rename=(identyfikator=id) in=b) ;
  204. by id ; /*kolumna po kt�rej ��czymy*/
  205. /*mechanizm ��cznia*/
  206. if a=b; /* inner join cz�c wsp�lna */ /* a=1 and b=1 ten sam zapis*/
  207. /* if a=1 left join */
  208. run;
  209.  
  210.  
  211.  
  212. /****************************************************************************************/
  213. /* dane biblioteka*/
  214. libname b "C:\Users\Student.WZIM\Desktop\BIBL";
  215.  
  216.  
  217. /*ustal czytelnik�w kt�rze nie oddali ksi��ki */
  218. /* ustal imie, nazwisko, miasto i czytelnika */
  219.  
  220. proc sort data=b.czytelnik;
  221. by id;
  222. run;
  223. proc sort data=b.wypozyczenia;
  224. by czytelnik_id;
  225. run;
  226.  
  227. data b.czarna_lista;
  228. merge b.czytelnik (in=c)
  229. b.wypozyczenia (rename=(czytelnik_id=id) in=w where=(DATA_ODDANIA=.)) ;
  230. by id ; /*kolumna po kt�rej ��czymy*/
  231. /*mechanizm ��cznia*/
  232. if c=w; /* inner join cz�c wsp�lna */ /* a=1 and b=1 ten sam zapis*/
  233. keep CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES KSIAZKA_SYGNATURA;
  234. run;
  235.  
  236.  
  237.  
  238.  
  239. /********************** 21-10-2018 *********************/
  240. /* wybra� top 5 u�ytkownik�w z najwi�ksz� liczb� wypo�ycze� */
  241.  
  242. data b.top_5;
  243. set b.wypozyczenia;
  244. by czytelnik_id;
  245. if first.czytelnik_id then licz_ks=0;
  246. licz_ks +1;
  247. if last.czytelnik_id;
  248. keep czytelnik_id licz_ks;
  249. run;
  250.  
  251. proc sort data=b.top_5;
  252. by descending licz_ks;
  253. run;
  254.  
  255. data b.top_5;
  256. set b.top_5;
  257. /*if _N_<=5 then output;*/
  258. if _N_=5 then call symput('top5', licz_ks);
  259.  
  260. run;
  261.  
  262.  
  263. data b.top_5;
  264. set b.top_5;
  265. if _N_<=5 or licz_ks >= &top5. ;
  266. run;
  267.  
  268.  
  269. /* po��cz z tabel� czytelnik - imie, nazwisko, adres */
  270. proc sort data=b.top_5;
  271. by czytelnik_id;
  272. run;
  273.  
  274. data b.top_5_czytelnicy;
  275. merge b.czytelnik (in=c)
  276. b.top_5 (in=t rename=(czytelnik_id=id));
  277. by ID;
  278. if c=t;
  279. keep CZYTELNIK_IMIE CZYTELNIK_NAZWISKO ADRES licz_ks;
  280. run;
  281.  
  282. proc sort data=b.top_5_czytelnicy;
  283. by descending licz_ks;
  284. run;
  285.  
  286.  
  287.  
  288.  
  289. /* na podstawie imienia (tabela czytelnik) ustali� p�e� czytelnik�w i zliczy� czytelnik�w w podziale na p�e� */
  290. data b.plec;
  291. set b.czytelnik;
  292. if substr(CZYTELNIK_IMIE,length(CZYTELNIK_IMIE),1)='a' then plec='K';
  293. else plec='M';
  294. keep id czytelnik_imie plec;
  295. run;
  296.  
  297.  
  298. proc sort data=b.plec;
  299. by plec;
  300. run;
  301.  
  302. data b.plec;
  303. set b.plec;
  304. by plec;
  305. if first.plec then liczba=0;
  306. liczba +1;
  307. if last.plec then output;
  308. keep plec liczba;
  309. run;
  310.  
  311.  
  312.  
  313. /********************************************************************/
  314. /* *********************** SAS SQL ********************************/
  315. /********************************************************************/
  316.  
  317. proc sql; /*�eby pisa� w SQL ! */
  318.  
  319. create table b.czytelnik_gdynia as
  320. select *
  321. from b.czytelnik
  322. where ADRES='Gdynia';
  323.  
  324.  
  325. /* quit; */ /*zastosowa� przy powrocie do sas4gl*/
  326.  
  327.  
  328.  
  329. /* case - when */
  330. /* pogrupowa� ksi��ki w zale�no�ci od roku wydania do 1980 - stare, 1980-2000 - wps�czesne, od 2000 - najnowsze */
  331. proc sql;
  332. create table b.podzial_ksiazek as
  333. select TYTUL, AUTOR_NAZWISKO, ROK_WYDANIA,
  334. case when ROK_WYDANIA<=1980 then 'stare'
  335. when ROK_WYDANIA<=2000 then 'wsp�czesne'
  336. else 'najnowsze'
  337. end as kategoria
  338. from b.ksiazka
  339. order by AUTOR_NAZWISKO;
  340.  
  341.  
  342. /* ustal najdro�sz� ksi��k� w tablei. podaj tytu� autora i cen� */
  343.  
  344. /* a) */
  345. proc sql;
  346. select TYTUL, AUTOR_NAZWISKO, CENA
  347. from b.ksiazka
  348. where CENA=(select max(cena) from b.ksiazka);
  349.  
  350. /* b) */
  351. proc sql;
  352. select TYTUL, AUTOR_NAZWISKO, CENA
  353. from b.ksiazka
  354. having CENA=max(CENA);
  355.  
  356.  
  357. /* c) */
  358. proc sql outobs=1;
  359. select TYTUL, AUTOR_NAZWISKO, CENA
  360. from b.ksiazka
  361. order by cena desc;
  362.  
  363.  
  364. /* ustal liczb� czytelnik� w ka�dym z miast i podaj udzia� procentowy. miasto - liczba czytelnikow - udzial procentowy*/
  365.  
  366. /* a) */
  367. proc sql;
  368. select ADRES, count(*) as liczba_czytelnikow,
  369. (select count(*) from b.czytelnik) as total,
  370. count(*)/(select count(*) from b.czytelnik) as pct format percent8.2
  371. from b.czytelnik
  372. group by 1; /*group by ADRES*/
  373.  
  374.  
  375. /* b) */
  376. proc sql;
  377. select ADRES, count(*) as liczba_czytelnikow,
  378. (select count(*) from b.czytelnik) as total,
  379. (calculated liczba_czytelnikow)/(calculated total) as pct format percent8.2 /* dzia�a tylko w sas */
  380. from b.czytelnik
  381. group by ADRES;
  382.  
  383.  
  384.  
  385.  
  386.  
  387.  
  388.  
  389.  
  390.  
  391. /* ############################## ZAJECIA 18-11-2018 #################################### */
  392. /* ###################################################################################### */
  393. /* #################################### F3 ########################################### */
  394.  
  395.  
  396.  
  397. /* 1 */
  398.  
  399. /* Dla ka�dego czytelnik_id, wyznacz ilo�� wypo�yczonych ksi��ek w poszczeg�lnych kwarta�ach 2007 roku
  400. W tabeli chcemy 5 kolumn: IDczytelnika, i wyp_kw1 - wyp_kw4 */
  401.  
  402. proc sql;
  403. create table b.wyp_2007 as
  404. select CZYTELNIK_ID, qtr(DATA_WYPOZYCZENIA) as kwartal,
  405. count(*) as liczba_wypozyczen
  406. from b.wypozyczenia
  407. group by CZYTELNIK_ID, 2;
  408.  
  409.  
  410.  
  411. proc sql;
  412. create table b.wyp_2007_v2 as
  413. select CZYTELNIK_ID,
  414. sum(qtr(DATA_WYPOZYCZENIA)=1) as kwartal_1,
  415. sum(qtr(DATA_WYPOZYCZENIA)=2) as kwartal_2,
  416. sum(qtr(DATA_WYPOZYCZENIA)=3) as kwartal_3,
  417. sum(qtr(DATA_WYPOZYCZENIA)=4) as kwartal_4
  418. from b.wypozyczenia
  419. group by 1;
  420.  
  421. /* ********************************************/
  422. /* ctrl + / */
  423. /* shift + ctrl + / */
  424. /**********************************************/
  425.  
  426. /*proc sql;*/
  427. /*create table b.wyp_2007_v3 as*/
  428. /*select CZYTELNIK_ID, */
  429. /*qtr(DATA_WYPOZYCZENIA)=1 as kwartal_1*/
  430. /*from b.wypozyczenia*/
  431. /*group by 1;*/
  432. /**/
  433. /*proc sql;*/
  434. /*create table b.wyp_2007_v3 as*/
  435. /*select CZYTELNIK_ID, */
  436. /*sum(qtr(DATA_WYPOZYCZENIA)=1) as kwartal_1*/
  437. /*from b.wypozyczenia*/
  438. /*group by 1;*/
  439.  
  440.  
  441.  
  442.  
  443.  
  444.  
  445.  
  446.  
  447. /************************ 2 ************************/
  448.  
  449. /* Ustal cztelnik�w kt�rzy posiadali nieoddane ksi��ki na dzie� 01-10-2007 */
  450. proc sql;
  451. create table b.nieoddane_01_10_2007 as
  452. select *
  453. from b.wypozyczenia
  454. where DATA_WYPOZYCZENIA<'01OCT2007'd and (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA is null);
  455. /*where DATA_WYPOZYCZENIA<'01OCT2007'd and (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA=.)*/
  456.  
  457.  
  458.  
  459.  
  460. /************************ 3 ************************/
  461. /* Na podstawie tabeli ksi��ka utw�rz kolumn� nowa_cena, kt�ra stanowi 90% ceny dla ksi��ek wydanych po 2000r (w��cznie) i 50% ceny dla ksi��ek wydanych przed 2000r */
  462. proc sql;
  463. create table b.ksiazka_nowe_ceny as
  464. select *,
  465. case when ROK_WYDANIA>=2000 then cena*0.9
  466. else cena*0.5
  467. end as nowa_cena
  468. from b.ksiazka;
  469.  
  470.  
  471.  
  472.  
  473.  
  474.  
  475. /************************ 4 ************************/
  476. /* podaj liczb� ksi��ek wydanych przed rakiem 2000 i po 2000 w��cznie */
  477. proc sql;
  478. create table b.ksiazki_2000 as
  479. select
  480. sum(ROK_WYDANIA>=2000) as po2000,
  481. sum(ROK_WYDANIA<2000) as przed2000
  482. from b.ksiazka;
  483.  
  484.  
  485.  
  486. proc sql;
  487. create table b.ksiazki_2000_v2 as
  488. select
  489. case when ROK_WYDANIA>=2000 then 'po 2000'
  490. else 'przed 2000'
  491. end as wydane_2000,
  492. count(*) as liczba_ksi�zek
  493. from b.ksiazka
  494. group by wydane_2000;
  495.  
  496.  
  497.  
  498.  
  499.  
  500.  
  501.  
  502.  
  503.  
  504.  
  505. /************************ 5 ************************/
  506. /* Podaj wszystkie ksi��ki wypo�yczone przez czytelnik�w z Gda�ska */
  507. /*a*/
  508. proc sql;
  509. create table b.wypozyczenia_gdansk as
  510. select *
  511. from b.wypozyczenia
  512. where CZYTELNIK_ID in (select CZYTELNIK_ID from b.czytelnik where ADRES = 'Gda�sk');
  513.  
  514.  
  515. /*b*/
  516. proc sql;
  517. create table b.wypozyczenia_gdansk_v2 as
  518. select w.*, c.ADRES
  519. from b.wypozyczenia as w inner join b.czytelnik as c
  520. on w.CZYTELNIK_ID = c.ID
  521. where c.ADRES = 'Gda�sk'
  522. order by w.CZYTELNIK_ID;
  523.  
  524.  
  525. /*c*/
  526. proc sql;
  527. create table b.wypozyczenia_gdansk_v3 as
  528. select w.*, c.ADRES
  529. from b.wypozyczenia as w, b.czytelnik as c
  530. where w.CZYTELNIK_ID = c.ID
  531. and c.ADRES = 'Gda�sk'
  532. order by w.CZYTELNIK_ID;
  533.  
  534.  
  535.  
  536.  
  537.  
  538.  
  539.  
  540.  
  541.  
  542. /************************ 6 ************************/
  543. /* Podaj 10 czytelnik�w z najwi�ksz� liczb� wypo�ycze�. W tabeli podaj imi�, nazwisko, adres i liczb� wypo�ycze� */
  544.  
  545. proc sql outobs=10;
  546. create table b.wypozyczenia_czetelnikow as
  547. select CZYTELNIK_ID, count(*) as liczba_wyp
  548. from b.wypozyczenia
  549. group by 1
  550. order by 2 desc;
  551.  
  552.  
  553.  
  554.  
  555. proc sql;
  556. create table b.wypozyczenia_czetelnikow_2 as
  557. select c.CZYTELNIK_IMIE, c.CZYTELNIK_NAZWISKO, c.ADRES, w.liczba_wyp
  558. from b.wypozyczenia_czetelnikow as w inner join b.czytelnik as c
  559. on (w.CZYTELNIK_ID = c.ID)
  560. order by liczba_wyp desc;
Add Comment
Please, Sign In to add comment