michciu

sas

Dec 5th, 2019
371
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /*19*/
  2. /*utworz ranking czytelnikow*/
  3. proc sql;
  4. create table ranking_czytelnikow as
  5. select c.id, c.czytelnik_imie, c.czytelnik_nazwisko, count(*) as liczba_wypozycz_ks
  6. from b.czytelnik as c inner join b.wypozyczenia as w on w.czytelnik_is = c.id
  7. group by 1, 2, 3
  8. order by 4 desc;
  9.  
  10.  
  11. quit;
  12. data b.ksiazka_by_gatunek;
  13. set b.ksiazka_sort;
  14. by gatunek;
  15. if first.gatunek then do;
  16. liczba_ksiazek=0;
  17. wartosc =0;
  18. end;
  19. liczba_ksiazek + 1;
  20. wartosc + CENA;
  21. if last.gatunek then output;
  22. keep gatunek liczba_ksiazek wartosc;
  23. run;
  24. /* SAS 4GL */
  25. /*09-11-2019*/
  26. /*nazewnictwo kolumn i tabel*/
  27. libname b "D:\Users\mm\BIBL";
  28.  
  29. data b.gdansk ; /*utworz tabele b.gdansk */
  30. set b.czytelnik ; /*pobierz z tabeli czytelnik*/
  31. /*where ADRES='Gdañsk' ; /* gdzie */
  32. where ADRES in ('Gdañsk','Gdynia');
  33. keep ID CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES; /*tylko wybrane kolumny - lub drop - wywalic niechciane*/
  34. run; /*koniec kodu do przetworzenia*/
  35.  
  36.  
  37. /*2*/
  38. /*skladnia if then else */
  39. /*rok wydania <1970 stare*/
  40. /* <2000 wspolczesne*/
  41. /* >= 2000 nowe*/
  42.  
  43. data b.kategorie_ksiazek;
  44. set b.ksiazka;
  45. length kategoria $11;
  46. if ROK_WYDANIA<1970 then kategoria='stare';
  47. else if ROK_WYDANIA<2000 then kategoria='wspolczesne';
  48. else kategoria='nowe';
  49. keep TYTUL AUTOR_NAZWISKO ROK_WYDANIA kategoria;
  50. run;
  51.  
  52. /* 3 */
  53. /*podaj najdrozsza ksiazke w tabeli*/
  54. proc sort data = b.ksiazka;
  55. by descending cena;
  56. run;
  57.  
  58. data b.max_cena;
  59. set b.ksiazka;
  60. if _N_ = 1 ;
  61. run;
  62.  
  63.  
  64. proc sort data = b.ksiazka out=b.ksiazka_sort;
  65. by descending cena;
  66. run;
  67.  
  68. data b.max_cena;
  69. set b.ksiazka_sort;
  70. if _N_ = 1 ;
  71. run;
  72.  
  73. /*4*/
  74. /*podaj wartosc ksiazek w tabeli */
  75.  
  76. data b.wartosc;
  77. set b.ksiazka end=koniec; /*znacnzik konca tabeli*/
  78. wartosc + CENA;
  79. if koniec; /*if koniec=1*/
  80. keep wartosc;
  81. run;
  82.  
  83. /*5*/
  84. /*grupowanie*/
  85. /*uwaga: dane do grupwoania musza byc posortowane po kolumnie*/
  86. /*zlicz czytelnikow w kazdym miescie*/
  87.  
  88. proc sort data = b.czytelnik out=b.czytelnik_sort;
  89. by ADRES;
  90. run;
  91.  
  92. data b.group_by_adres;
  93. set b.czytelnik_sort;
  94. by adres; /*group by*/
  95. if first.adres then liczba_czytelnikow=0;
  96. liczba_czytelnikow+1;
  97. if last.adres then output;
  98. keep adres liczba_czytelnikow;
  99. run;
  100.  
  101. /*6*/
  102. /*pogrupowac ksiazki po kolumnie gatunek, zliczyc je oraz podac ich wartosc*/
  103. proc sort data = b.ksiazka out=b.ksiazka_sort;
  104. by GATUNEK;
  105. run;
  106.  
  107. data b.ksiazka_by_gatunek;
  108. set b.ksiazka_sort;
  109. by gatunek;
  110. if first.gatunek then liczba_ksiazek=0;
  111. liczba_ksiazek + 1;
  112. if first.gatunek then wartosc=0;
  113. wartosc + CENA;
  114. if last.gatunek then output;
  115. keep gatunek liczba_ksiazek wartosc;
  116. run;
  117.  
  118. /*lub*/
  119.  
  120. data b.ksiazka_by_gatunek;
  121. set b.ksiazka_sort;
  122. by gatunek;
  123. if first.gatunek then do;
  124. liczba_ksiazek=0;
  125. wartosc =0;
  126. end;
  127. liczba_ksiazek + 1;
  128. wartosc + CENA;
  129. if last.gatunek then output;
  130. keep gatunek liczba_ksiazek wartosc;
  131. run;
  132.  
  133. /*7*/
  134. /*podaj liczbe wypozyczen dla kazdego miesiacu 2007 roku*/
  135. data b.wyp_2007;
  136. set b.Wypozyczenia;
  137. where year(DATA_WYPOZYCZENIA)=2007;
  138. miesiac=month(DATA_WYPOZYCZENIA);
  139. run;
  140.  
  141. proc sort data=b.wyp_2007;
  142. by miesiac;
  143. run;
  144.  
  145. data b.wyp_2007;
  146. set b.wyp_2007;
  147. by miesiac;
  148. if first.miesiac then licz_wyp=0;
  149. licz_wyp +1;
  150. if last.miesiac then output;
  151. keep miesiac licz_wyp;
  152. run;
  153.  
  154. /*8*/
  155. /*na podstawie imienia ustalic plec*/
  156. /*ustalic staz czytelnika na dzis*/
  157.  
  158. data b.czytelnik_plec;
  159. set b.czytelnik;
  160. if substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE), 1) = 'a' then plec = 'K' ;
  161. else plec = 'M';
  162. staz = today() - DATA_ZAPISU;
  163. staz_lata = intck('year', DATA_ZAPISU, today());
  164. staz_mce = intck('month', DATA_ZAPISU, today());
  165. dzis = today();
  166. format dzis ddmmyy10. ;
  167. run;
  168.  
  169.  
  170. /*9*/
  171. /*laczenie tabel*/
  172. /*tebele musza byc posortowane */
  173. /*w obu tabelach klucz/kolumna do laczenia musi miec taka sama nazwe*/
  174.  
  175. /*dla czytelnikow z gdanska wybierz wszystkie wypozyczenia, ktore mialy miejsce w Q1 2007*/
  176.  
  177.  
  178. proc sort data=b.czytelnik out=b.czytelnik_sort;
  179. by id;
  180. run;
  181.  
  182.  
  183. proc sort data=b.wypozyczenia out=b.wypozyczenia_sort;
  184. by czytelnik_id;
  185. run;
  186.  
  187.  
  188. data b.wypozyczenia_gdansk_q1_2007;
  189. merge  
  190. b.czytelnik_sort (in=c where=(ADRES='Gdañsk'))
  191. b.wypozyczenia_sort (in=w rename=(CZYTELNIK_ID=ID) where=(year(DATA_WYPOZYCZENIA)=2007 and qtr(DATA_WYPOZYCZENIA)=1) );
  192. by id;
  193. if c=w; /* inner join - iloczyn; lewostronone - samo "if c", prawostronne "if w"*/
  194. keep CZYTELNIK_NAZWISKO ADRES KSIAZKA_SYGNATURA DATA_WYPOZYCZENIA;
  195. run;
  196.  
  197.  
  198. /*sql w sas*/
  199. /*10*/
  200. /*wybrac czytelnikow z gdyni i gdanska*/
  201. proc sql;
  202. create table b.czytelnicy_wybrzeze as
  203. select *
  204. from b.czytelnik
  205. where adres in ('Gdañsk', 'Gdynia') ;
  206. quit;
  207.  
  208.  
  209. /*11*/
  210. /*grupowanie*/
  211. proc sql;
  212. create table b.czytelnicy_wartosc as
  213. select gatunek, count(*)as liczba_ks, sum(CENA) as wartosc_ks
  214. from b.ksiazka
  215. group by 1;
  216. order by 2 desc;
  217.  
  218. quit;
  219.  
  220. /**/
  221. /*12*/
  222. /*case when */
  223. /*rok wysania <1970 - stare < 200 wspolczesne*/
  224. /*>=2000 nowe*/
  225.  
  226. proc sql;
  227. create table b.kategorie_ks as
  228. select *,
  229. case when rok_wydania <1970 then 'stare'
  230. when rok_wydania <2000 then 'wspolczesne'
  231. else 'nowe'
  232. end as kategorie_ks, count(*) as liczba_ks
  233. from b.ksiazka;
  234.  
  235.  
  236. /*13*/
  237. /*zliczyc wypozyczenia dla kazdego z czytelnikow z podziaelm na kwartaly*/
  238. proc sql;
  239. create table b.wyp_kwartaly as
  240. select CZYTELNIK_ID,
  241. qtr(DATA_WYPOZYCZENIA) as kwartal,
  242. count(*) as liczba_wyp_ks
  243. from b.wypozyczenia
  244. where year(DATA_WYPOZYCZENIA)=2007
  245. group by 1,2 ;
  246.  
  247. quit;
  248.  
  249.  
  250. /*v2*/
  251.  
  252. proc sql;
  253. create table b.wyp_kwartaly as
  254. select  CZYTELNIK_ID,
  255. sum(case when qtr(DATA_WYPOZYCZENIA)=1 then 1 else 0 end) as wyp_kw1,
  256. sum(case when qtr(DATA_WYPOZYCZENIA)=2 then 1 else 0 end) as wyp_kw2,
  257. sum(case when qtr(DATA_WYPOZYCZENIA)=3 then 1 else 0 end) as wyp_kw3,
  258. sum(case when qtr(DATA_WYPOZYCZENIA)=4 then 1 else 0 end) as wyp_kw4,
  259. count(*) as total
  260. from b.wypozyczenia
  261. where year(DATA_WYPOZYCZENIA)=2007
  262. group by 1;
  263.  
  264. /*skrocone*/
  265.  
  266. proc sql;
  267. create table b.wyp_kwartaly as
  268. select  CZYTELNIK_ID,
  269. sum(qtr(DATA_WYPOZYCZENIA)=1) as wyp_kw1,
  270. sum(qtr(DATA_WYPOZYCZENIA)=2) as wyp_kw2,
  271. sum(qtr(DATA_WYPOZYCZENIA)=3) as wyp_kw3,
  272. sum(qtr(DATA_WYPOZYCZENIA)=4) as wyp_kw4,
  273. count(*) as total
  274. from b.wypozyczenia
  275. where year(DATA_WYPOZYCZENIA)=2007
  276. group by 1;
  277.  
  278. /*14*/
  279. /*z tabeli czytelnik zlicz czytelnikow w podziale na miasto i podaj udzial procentowy*/
  280. proc sql;
  281. create table b.czytelnicy_miasta as
  282. select ADRES, count(*) as liczba_czyt,
  283. count(*) / (select count(*) from b.czytelnik) as udzial_procentowy format percent8.2
  284. from b.czytelnik
  285. group by 1;
  286.  
  287. quit;
  288.  
  289. /*15*/
  290. /*wybrac ksiazki ktorych cena jest wyzsza od sredniej ceny*/
  291. proc sql;
  292. create table b.cena_pow_sredniej as
  293. select tytul, cena, avg(cena) as srednia_cena,(select avg(cena) from b.ksiazka) as sr_cena_v2
  294. from b.ksiazka
  295. where cena > (select avg(cena) from b.ksiazka);
  296.  
  297. quit;
  298.  
  299. /*16*/
  300. /*zliczyc czytelnikow w podziale na plec i podac udzial procentowy*/
  301. proc sql;
  302. create table b.podzial_na_plec_procent as
  303. select case when substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE), 1) = 'a' then 'k' else 'm' end as plec,
  304.         count(*) as liczba_czytelnikow,
  305.         count(*) / (select count(*) from b.czytelnik) as udzial_procentowy format percent8.2
  306. from b.czytelnik
  307. group by 1;
  308.  
  309. quit;
  310.  
  311. /*17*/
  312. /*zapytanie ktore zwroci przetrzymane powyzej 30 dni lub nieoddane*/
  313. proc sql;
  314. create table b.przetrzymane as
  315. select *
  316. from b.wypozyczenia
  317. where  data_wypozyczenia is null or (data_oddania - data_wypozyczenia) > 30;
  318. quit;
  319.  
  320. /*18*/
  321. /*laczenie tabel*/
  322. /*podaj wszystkie ksiazki wypozyczone przez czytelnikow z sopotu*/
  323. proc sql;
  324. create table b.wypozyczenia_sopot as
  325. select *
  326. from b.wypozyczenia
  327. where czytelnik_id in (select id from b.czytelnik where adres='Sopot');
  328.  
  329. quit;
  330.  
  331. /*v2*/
  332. proc sql;
  333. create table b.wypozyczenia_sopot as
  334. select c.adres='Sopot', c.id, c.czytelnik_nazwisko, w.ksiazka_sygnatura, w.data_wypozyczenia
  335. from b.wypozyczenia as w inner join b.czytelnik as c
  336. on w.czytelnik_id = c.id
  337. where c.adres ='Sopot';
  338.  
  339. quit;
  340.  
  341.  
  342. /*19*/
  343. /*utworz ranking czytelnikow*/
  344. proc sql;
  345. create table b.ranking_czytelnikow as
  346. select c.id, c.czytelnik_imie, c.czytelnik_nazwisko, count(*) as liczba_wypozycz_ks
  347. from b.czytelnik as c inner join b.wypozyczenia as w on w.czytelnik_id = c.id
  348. group by 1, 2, 3
  349. order by 4 desc;
  350.  
  351. quit;
  352.  
  353. /*20*/
  354. /*jak ustalic tych ktorzy nic nie wypozyczyli*/
  355. proc sql;
  356. create table b.nie_wypozyczyli as
  357. select *
  358. from b.czytelnik
  359. where id not in (select distinct czytelnik_id from b.wypozyczenia);
  360.  
  361. quit;
  362.  
  363.  
  364. /*v2*/
  365.  
  366. proc sql;
  367. create table b.nie_wypozyczyli as
  368. select c.*, w.czytelnik_id
  369. from b.czytelnik as c left join b.wypozyczenia as w on c.id = w.czytelnik_id
  370. where w.czytelnik_id is null
  371.  
  372. quit;
  373.  
  374. /*21*/
  375. /*stworzy ranking tytulow, podaj tytul ksiazki, autora, liczbe wypozyczonych*/
  376. proc sql;
  377. create table b.ranking_tytulow as
  378. select k.tytul, k.AUTOR_NAZWISKO, k.AUTOR_IMIE, count(*) as liczba_wypozyczen
  379. from b.ksiazka as k inner join b.wypozyczenia as w on k.sygnatura = w.KSIAZKA_SYGNATURA
  380. group by 1, 2
  381. order by 4 desc;
  382. quit:
RAW Paste Data