Advertisement
Guest User

Untitled

a guest
Oct 29th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SAS 19.32 KB | None | 0 0
  1. /* komentarz */
  2. /* przypisanie biblioteki */
  3. libname s "C:\Users\STUDENT\Desktop\SBI" ; /*tworze biblioteke s w miejscu na pulpicie */
  4. /* jak uruchomic - F3/F8 */
  5. /* 4GL */
  6.  
  7. /* 1 */
  8. /* Pobierz dane z sashelp.cars, gdzie pojazd to audi i zapisz w nowej tabeli w bibliotece S */
  9.  
  10. data s.audi ; /* utworz tabele */
  11. set sashelp.cars ; /* set - pobierz z */
  12. where make = 'Audi' ; /* warunek */
  13. /* where upcase(make) = 'AUDI' ; -  wielkie znaki */
  14. run; /* koniec bloku kodu do pzetworzenia */
  15.  
  16.  
  17. /* 2 */
  18. /* Pobierz dane z sashelp.cars, gdzie pojazd to audi lub BMW. W nowej tabeli w bibliotece S zapisz tylko 3 kolumny: make model invoice */
  19.  
  20. data s.audi ; /*(keep = make model invoice) - druga opcja keep */
  21. set sashelp.cars ;
  22. where upcase(make) in ('AUDI', 'BMW') ;
  23. /* where upcase(make) = 'AUDI' or upcase(make) = 'BMW' ; -  wielkie znaki */
  24. keep make model invoice ; /* drop */
  25. run;
  26.  
  27. /* 3 */
  28. /* if then else */
  29. /* Pobierz dane z sashelp.cars i w zalezności od kolumny invoice utwórz kolumne kategoria_cenowa ('niska,'średnia','wysoka') */
  30.  
  31. data s.kategoria_cenowa ;
  32. set sashelp.cars ;
  33. length kategoria_cenowa $7. ; /* ustalenie długości znaków w tabeli */
  34. if Invoice<30000 then kategoria_cenowa='niska' ;
  35. else if Invoice<60000 then kategoria_cenowa='średnia' ;
  36. else kategoria_cenowa='wysoka' ;
  37. keep make model invoice kategoria_cenowa;
  38. run;
  39.  
  40. /* 4 */
  41. /* Wybiez najtansze auto z tabeli cars */
  42. /* konieczne sortowanie tabeli */
  43.  
  44. proc sort data = sashelp.cars out = s.cars_sorted ;
  45. /* by descending Invoice ; - malejacy */
  46. by Invoice ; /* domyslne jest ascending */
  47. run;
  48.  
  49.  
  50. data s.najtansze ;
  51. set s.cars_sorted ;
  52. if _N_ = 1 ; /* _N_ - numerator */
  53. run;
  54.  
  55. /* 5 */
  56. /* Podaj wartosc wszystkich pojazdow w tabeli wedlug kolumny Invoice */
  57.  
  58. data s.wart_pojazdow ;
  59. set sashelp.cars end = koniec;
  60. wartosc + invoice ;
  61. if koniec=1 then output; /* jesli prawda to zrzut */
  62. keep wartosc ;
  63. run;
  64.  
  65. /* 6 */
  66. /* Przetwarzanie w grupach */
  67. /* na podstawie tabeli cars zlicz pojazdy dla kazdej marki */
  68. /* dane musza byc posortowane wedlug kolumny do grupowania */
  69.  
  70. proc sort data = sashelp.cars out = s.cars_sorted ;
  71. by make ; /* sortowanie od A do Z */
  72. run;
  73.  
  74. data s.liczba_pojazdow ;
  75. set s.cars_sorted;
  76. by make ; /* group by */
  77. if first.make then liczba_pojazdow=0 ;
  78. liczba_pojazdow + 1 ;
  79. if last.make then output;
  80. keep make model liczba_pojazdow;
  81. run;
  82.  
  83. /* 7 */
  84. /* Do danych z zad 6 podaj wartosc pojazdow */
  85.  
  86. data s.liczba_pojazdow_v2 ;
  87. set s.cars_sorted;
  88. by make ; /* group by */
  89. if first.make then liczba_pojazdow=0 ;
  90. if first.make then wartosc=0 ;
  91. liczba_pojazdow + 1 ;
  92. wartosc + invoice ;
  93. if last.make then output;
  94. keep make liczba_pojazdow wartosc;
  95. run;
  96.  
  97. /**************************************************/
  98. /* 08/10/2018 */
  99. /**************************************************/
  100.  
  101. /* 1 */
  102. /* na podstawie tabeli cars utwórz kolumnę nowa_cena,
  103. która stanowi 90% wartości z kolumny invoice
  104. wartości proszę zaokąglić do 2 miejsc po przecinku
  105. */
  106.  
  107. data s.nowa_cena ;
  108. set sashelp.cars ;
  109. nowa_cena = ROUND(invoice * 0.9,0.01) ;
  110. format nowa_cena dollar12.2; /* .2 - dwie wartosci po przecinku, 12 - liczba bajtow */
  111. keep make model invoice nowa_cena ;
  112. run ;
  113.  
  114. /* 2 */
  115. /* Daty w SAS */
  116.  
  117. data s.dzis ;
  118. dzis = today() ;
  119. /* format dzis ddmmyy10. ; */
  120. format dzis date9. ;
  121. wiek = dzis - '19FEB1996'd ; /*format musi pasowac, podawanie daty jako stalej w kodzie,  d - format daty */
  122. dzien = day(dzis);
  123. dzien_ty = weekday(dzis);
  124. mies = month(dzis);
  125. rok = year(dzis);
  126. kw = qtr(dzis);
  127. run ;
  128.  
  129. /* 3 */
  130. /* Łączenie tabel w 4GL */
  131.  
  132. data s.tabela_A ;
  133. do id = 1 to 1000 ;
  134. kolumna_A = 'AAA' ;
  135. output ; /* output musi być przed endem bo po każdej iteracji muszę zrzucić */
  136. end ;
  137. run ;
  138.  
  139.  
  140. data s.tabela_B ;
  141. do identyfikator = 1 to 1500 by 10 ;
  142. kolumna_B = 'BBB' ;
  143. output ; /* output musi być przed endem bo po każdej iteracji muszę zrzucić */
  144. end ;
  145. run ;
  146.  
  147. /* do łączenia MERGE */
  148. /* klucze(kolumny) do łączenia muszą mieć taką samą nazwę */
  149. /* tabele do łączenia muszą być posortowane po kolumnach kluczach */
  150.  
  151. /* najpiew trzeba posortować */
  152.  
  153. proc sort data =  s.tabela_A;
  154. by id ;
  155. run ;
  156.  
  157. proc sort data =  s.tabela_B;
  158. by identyfikator ;
  159. run ;
  160.  
  161. /* łączenie */
  162.  
  163. data s.merge_tabela_AB ;
  164. merge s.tabela_A ( in = a ) /* in - alias tabeli */
  165.       s.tabela_B ( rename = (identyfikator=id) in = b ) ; /* spełnienie wymogu, że klucze do kolumny mają tę samą nazwę */
  166. by id ; /* klucz łączenia */
  167. /* if a=b ; /* typ złączenia - inner join , część wspólna */
  168. /* if a=1 ; /* złączenie left join */
  169. if a=1 and b = 0 ;
  170. /* if a=1 or b=1 ; /* suma */
  171. run ;
  172.  
  173. /* biblioteka B */
  174. libname B "C:\Users\STUDENT\Desktop\BIBL" ;
  175.  
  176. /* 4 */
  177. /* Ustal czytelników, którzy posiadają nieodanne książki
  178. podaj imie, nazwisko, adres, liczbe przetrzymywanych książek */
  179.  
  180. /*Selekcja nioddanych książek */
  181. data B.nieoddane ;
  182. set b.wypozyczenia ;
  183. where DATA_ODDANIA = . ;
  184. by czytelnik_id ;
  185. if first.czytelnik_id then licz_nieoddane = 0 ;
  186. licz_nieoddane +1 ;
  187. if last.czytelnik_id ;
  188. keep czytelnik_id licz_nieoddane ;
  189. run ;
  190.  
  191. /* Łączenie tabel */
  192.  
  193. data b.nieoddane_czytelnicy ;
  194. merge b.CZYTELNIK (in=c)
  195.       b.nieoddane (in=n rename=(czytelnik_id=id)) ;
  196. by id ;
  197. if c=n;
  198. keep CZYTELNIK_NAZWISKO CZYTELNIK_IMIE ADRES licz_nieoddane;
  199. run ;
  200.  
  201. /* 5 */
  202. /* Ustal 5 najczęściej wypożyczanych tytułów */
  203.  
  204. proc sort data=b.WYPOZYCZENIA ;
  205. by ksiazka_sygnatura ;
  206. run ;
  207.  
  208. data b.wyp_ks ;
  209. set b.wypozyczenia ;
  210. by ksiazka_sygnatura ;
  211. if first.ksiazka_sygnatura then licz_ks=0;
  212. licz_ks + 1;
  213. if last.ksiazka_sygnatura ;
  214. keep ksiazka_sygnatura licz_ks ;
  215. run ;
  216.  
  217. data b.najczesciej_wybierane ;
  218. merge b.KSIAZKA (in=k)
  219.       b.wyp_ks ( in=wk rename=(ksiazka_sygnatura=sygnatura)) ;
  220. by sygnatura ;
  221. if k=wk ;
  222. keep AUTOR_NAZWISKO tytul sygnatura licz_ks ;
  223. run ;
  224.  
  225. proc sort data=b.najczesciej_wybierane ;
  226. by tytul ;
  227. run ;
  228.  
  229. data b.najczesciej_wybierane ;
  230. set b.najczesciej_wybierane ;
  231. by tytul ;
  232. if first.tytul then licz_wypozyczenia=0;
  233. licz_wypozyczenia + licz_ks ;
  234. if last_tytul ;
  235. keep tytul AUTOR_NAZWISKO licz_wypozyczenia ;
  236. run ;
  237.  
  238. proc sort data=b.najczesciej_wybierane ;
  239. by descending licz_wypozyczenia ;
  240. run ;
  241.  
  242. data b.top_5 ;
  243. set b.najczesciej_wybierane ;
  244. if _N_<=5 or licz_wypozyczenia>=8 ;
  245. run ;
  246.  
  247. /* parametr call symput */
  248.  
  249. /* 6 */
  250. /* Dla każdego czytelnika podaj liczbę wypożyczonych ksiązek
  251. w kazdym kwartale 2007 roku */
  252. /* tabela ma mieć 5 kolumn i 58 wierszy(czytelników) */
  253.  
  254. data b.wyp_qtr ;
  255. set b.wypozyczenia ;
  256. kw1 = qtr(DATA_WYPOZYCZENIA)=1 ;
  257. kw2 = qtr(DATA_WYPOZYCZENIA)=2 ;
  258. kw3 = qtr(DATA_WYPOZYCZENIA)=3 ;
  259. kw4 = qtr(DATA_WYPOZYCZENIA)=4 ;
  260. run ;
  261.  
  262. proc sort data=b.wyp_qtr ;
  263. by czytelnik_id ;
  264. run ;
  265.  
  266. data b.wyp_qtr ;
  267. set b.wyp_qtr ;
  268. by czytelnik_id ;
  269. if first.czytelnik_id then do ;
  270. wypozyczenia_kw1=0;
  271. wypozyczenia_kw2=0;
  272. wypozyczenia_kw3=0;
  273. wypozyczenia_kw4=0;
  274. end ;
  275. wypozyczenia_kw1 + kw1 ;
  276. wypozyczenia_kw2 + kw2 ;
  277. wypozyczenia_kw3 + kw3 ;
  278. wypozyczenia_kw4 + kw4 ;
  279. if last.czytelnik_id ;
  280. keep czytelnik_id wypozyczenia_kw1-wypozyczenia_kw4 ;
  281. run ;
  282.  
  283. /* 7 */
  284. /* f. tekstowych */
  285. /* płeć na podstawi ostatniej litery imienia */
  286. data b.plec ;
  287. set b.czytelnik ;
  288. /* ost_litera=substr(CZYTELNIK_IMIE,5,3) ; /* Czytanie od 5 znaku przez 3 kolejne */
  289. ost_litera=substr(CZYTELNIK_IMIE,length(CZYTELNIK_IMIE),1) ; /* Ostatnia litera imienia */
  290. if ost_litera='a' then plec='K' ;
  291. else plec='M' ;
  292. keep CZYTELNIK_IMIE CZYTELNIK_NAZWISKO plec;
  293. run ;
  294.  
  295. /**************************/
  296. /* 15.10.2018 */
  297. /**************************/
  298.  
  299. /*1*/
  300. /* Wyznacz 5 czytelników z największą liczbą nieoddanych książek,
  301. Podaj: imię, nazwisko, adres i liczbę nieoddanych książek */
  302.  
  303. proc sort data = b.wypozyczenia;
  304. by czytelnik_id;
  305. run;
  306.  
  307. data b.nieoddane;
  308. set b.wypozyczenia ;
  309. where data_oddania = .;
  310. by czytelnik_id;
  311. if first.czytelnik_id then licz_ks=0;
  312. licz_ks+1;
  313. if last.czytelnik_id;
  314. keep czytelnik_id licz_ks;
  315. run;
  316.  
  317. proc sort data = b.nieoddane;
  318. by descending licz_ks ;
  319. run;
  320.  
  321. data b_nieoddane_top5;
  322. set b.nieoddane;
  323. if _N_=5 then call symput('N5', licz_ks);
  324. run;
  325.  
  326. data b.nieoddane_top5;
  327. set b.nieoddane_top5;
  328. where licz_ks>=&N5; /* & - macro parametr */
  329. run;
  330.  
  331. /* zrobic łączenie z tabelą czytelnik */
  332.  
  333. /*******************************/
  334. /* SAS SQL */
  335. /******************************/
  336.  
  337. proc sql;
  338. create table b.auta as
  339. select *
  340. from sashelp.cars
  341. where make in ('Audi','BMW');
  342.  
  343. /*1*/
  344. /* Na podstawie tabeli cars utwórz kolumnę nowa_cena,
  345. która stanowi 90% wartości z kolumny invoice,
  346. wartości zaokrąglić do 2 miejsc po pzecinku */
  347.  
  348. proc sql;
  349. create table b.nowa_Cena as
  350. select make, model, invoice,
  351. ROUND(invoice*0.9,0.01) as nowa_cena format dollar12.2
  352. from sashelp.cars;
  353.  
  354. /*2*/
  355. /* Zlicz ilość i wartość pojazdów w ramach marek */
  356.  
  357. proc sql;
  358. create table b.grupowanie_pojazdow as
  359. select make, count(*) as liczba_pojazdow,
  360. sum(invoice) as wartosc_pojazdow
  361. from sashelp.cars
  362. group by /*make*/ 1;
  363.  
  364. quit; /* gdy wychodzę ze składni sql */
  365.  
  366. proc sql;
  367. create table b.grupowanie_pojazdow as
  368. select make, count(*) as liczba_pojazdow,
  369. sum(invoice) as wartosc_pojazdow
  370. count(distinct type) as typy_pojazdow /* distinct - unikalny */
  371. from sashelp.cars
  372. group by /*make*/ 1;
  373.  
  374. /*3*/
  375. /* case when */
  376. /* Pobierz dane z sashelp.cars i w zależności od kolumny
  377. invoice utwórz kolumnę kategoria_cenowa
  378. ('niska', 'srednia', 'wysoka') */
  379.  
  380. proc sql;
  381. create table b.kategoria_cenowa as
  382. select make, model, invoice,
  383.     case when invoice <300000 then 'niska'
  384.     when invoice <600000 then 'srednia'
  385.     else 'wysoka'
  386. end as kategoria_cenowa
  387. from sashelp.cars;
  388.  
  389. /*4*/
  390. /* Podaj najtańsze auto w tabeli,
  391. zachowaj w niej kolumny make, model, invoice */
  392.  
  393. /*1 - za pomocą having */
  394. proc sql;
  395. create table b.najtansze as
  396. select make, model, invoice,
  397. from sashelp.cars
  398. having invoice=min(invoice);
  399.  
  400. /*2 - za pomocą order by */
  401. proc sql outobs=1; /*ile rekordów zwraca */
  402. create table b.najtansze as
  403. select make, model, invoice
  404. from sashelp.cars
  405. order by invoice;
  406.  
  407. /*3 - za pomocą where */
  408. proc sql ;
  409. create table b.najtansze as
  410. select make, model, invoice
  411. from sashelp.cars
  412. where invoice = ( select min(invoice) from sashelp.cars ) ; /* kwerenda zagnieżdżona */
  413.  
  414. /*5*/
  415. /* Stworzyc zestawienie w podziale na ORIGIN
  416. Tabela ma zawierać kolumny ORIGIN, liczbę pojazdów, udział procentowy */
  417.  
  418. proc sql ;
  419. create table b.origin as
  420. select origin, count(*) as liczba_pojazdow
  421.     (select count(*) from sashelp.cars) as total_cars,
  422.     (calculated liczba_pojazdow)/ (calculated total_cars)
  423.     as udzial_procentowy format percent8.2
  424. from sashelp.cars
  425. group by 1 ;
  426.  
  427. /* lub */
  428.  
  429. proc sql ;
  430. create table b.origin as
  431. select origin, count(*) as liczba_pojazdow
  432.     (select count(*) from sashelp.cars) as total_cars,
  433.     count(*)/ (select count(*) from sashelp.cars)
  434.     as udzial_procentowy format percent8.2
  435. from sashelp.cars
  436. group by 1 ;
  437.  
  438. /*6*/
  439. /* Na podstawie imion czytelników ustalić liczbę czytelników
  440. kobiet i mężczyzn w każdym mieście oraz udział procentowy
  441. Tabela ma zawierać 5 kolumn: miasto, l_kobiet, udział % kobiet,
  442. l_mezczyzn, udział & mężczyzn */
  443.  
  444. proc sql ;
  445. create table b.miasto_plec as
  446. select adres,
  447. sum(substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE),1)='a')
  448.     as liczba_kobiet,
  449. sum(substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE),1) NE 'a')
  450.     as liczba_mezczyzn,
  451. (calculated liczba_kobiet) / (calculated liczba_kobiet + calculated liczba_mezczyzn)
  452. as udzial_pct_kobiet format percent8.2,
  453. 1 - (calculated udzial_pct_kobiet)
  454. as udzial_pct_mezczyzn format percent8.2
  455. from b.czytelnik
  456. group by ADRES ;
  457.  
  458. /*7*/
  459. /* Dla kazdego czytelnika podaj liczbę wypożyczonych ksiazek w kazdym kwartale 2007
  460. Tabela ma miec 5 kolumn i 58 wierszy(czytelników)*/
  461.  
  462. proc sql ;
  463. create table b.wypozyczenia_kwartaly as
  464. select czytelnik_id,
  465.     sum(qtr(DATA_WYPOZYCZENIA)=1) as kw1,
  466.     sum(qtr(DATA_WYPOZYCZENIA)=2) as kw2,
  467.     sum(qtr(DATA_WYPOZYCZENIA)=3) as kw3,
  468.     sum(qtr(DATA_WYPOZYCZENIA)=4) as kw4
  469. from b.wypozyczenia
  470. where year(data_wypozyczenia)=2007
  471. group by 1 ;
  472.  
  473. /*8*/
  474. /* Ustal wypożyczone i nieodane książki na dzień 1 października 2007 roku */
  475.  
  476.  
  477. proc sql;
  478. create table b.stan_na_1_paz as
  479. select *
  480. from b.wypozyczenia
  481. where data_wypozyczenia<'01OCT2007'd
  482. and (data_oddania>='01OCT2007'd or data_oddania=.);
  483.  
  484. /*******************************/
  485. /* 15/10/2018 */
  486.  
  487. /* 1 */
  488. /* wyznacz 5 czytelików z największą
  489.     liczbą nieoddanych ksiażek: podaj imie, nazwisko, adres
  490. i liczbę nieoddanych ksiażek */
  491.  
  492. proc sort data=b.WYPOZYCZENIA;
  493. by  czytelnik_id; run;
  494.  
  495. data b.nieoddane ;
  496. set b.WYPOZYCZENIA ;
  497. where data_oddania = . ;
  498. by  czytelnik_id;
  499. if first.czytelnik_id then licz_ks=0;
  500. licz_ks +1;
  501. if last.czytelnik_id;
  502. keep czytelnik_id licz_ks;
  503. run;
  504.  
  505. proc sort data=b.nieoddane;
  506. by descending licz_ks; run;
  507.  
  508. data b.nieoddane_top5 ;
  509. set b.nieoddane;
  510. if _N_=5 then call symput('N5', licz_ks);
  511. run;
  512. data b.nieoddane_top5 ;
  513. set b.nieoddane_top5 ;
  514. where licz_ks>=&N5; /* & - macro parametr */
  515. run;
  516.  
  517. /* zrobić łaczenie z tabelą czytelnik */
  518.  
  519. /******************************/
  520. /* SAS SQL */
  521. /******************************/
  522. /* 2 */
  523. proc sql;
  524. create table b.auta as
  525. select *
  526. from sashelp.cars
  527. where  make in ('Audi', 'BMW')  ;
  528.  
  529. /* 3 */
  530. /* na podstawie tabeli cars utwórz kolumnę nowa_cena,
  531. która stanowi 90% wartość z kolumny invoice,
  532. wartości proszę zaokrąglić do 2 m-c po przecinku */
  533. proc sql;
  534. create table b.nowa_Cena as
  535. select make, model, invoice,
  536. ROUND(invoice*0.9,0.01) as nowa_cena format dollar12.2
  537. from sashelp.cars ;
  538.  
  539. /* 4 */
  540. /* zlicz ilość i wartosc pojazdów w ramach marek */
  541. proc sql;
  542. create table b.grupowanie_pojazdow as
  543. select make, count(*) as liczba_pojazdow,
  544. sum(invoice) as wartosc_pojazdow,
  545. count(distinct type) as typy_pojazdow
  546. from sashelp.cars
  547. group by /*make*/ 1 ;
  548.  
  549. /*quit;*/ /* gdy wychodzę, ze składni SQL */
  550.  
  551. /* 5 */
  552. /* case when*/
  553. /* pobierz dane z sashelp.cars i w zalezności od kolumny
  554. invoice utworz kolumnę kategoria_cenowa
  555. ('niska', 'średnia','wysoka') */
  556.  
  557. proc sql;
  558. create table b.kategoria_cenowa as
  559. select make, model, invoice,
  560.         case when invoice<30000 then 'niska'
  561.         when invoice<60000 then 'średnia'
  562.         else 'wysoka'
  563.         end as kategoria_cenowa
  564. from sashelp.cars ;
  565.  
  566. /* 6*/
  567. /* podaj najtansze auto w tabeli */
  568. /* w tabeli zachowaj kolumny, make, model, invoice */
  569.  
  570. proc sql;
  571. create table b.najtansze as
  572. select make, model, invoice
  573. from sashelp.cars
  574. having invoice=min(invoice) ;
  575. /*lub*/
  576. proc sql outobs=1; /* outobs - numerator */
  577. create table b.najtansze as
  578. select make, model, invoice
  579. from sashelp.cars
  580. order by invoice ;
  581. /* lub */
  582. proc sql ;
  583. create table b.najtansze as
  584. select make, model, invoice
  585. from sashelp.cars
  586. where invoice= ( select min(invoice) from sashelp.cars ) ;
  587. /* 7*/
  588. /* stworzyć zestawienie w podziale na ORIGIN */
  589. /* tabela ma zawierac kolumny ORIGIN,
  590. liczbę pojazdów, udział procentowy */
  591. proc  sql;
  592. create table b.origin as
  593. select origin, count(*) as liczba_pojazdow,
  594.     (select count(*) from sashelp.cars) as total_cars ,
  595.     (calculated liczba_pojazdow )/ (calculated total_cars)
  596.     as udzial_procentowy format percent8.2
  597. from sashelp.cars
  598. group by 1 ;
  599. /* lub */
  600. proc  sql;
  601. /*create table b.origin as*/
  602. select origin, count(*) as liczba_pojazdow,
  603.     (select count(*) from sashelp.cars) as total_cars ,
  604.     count(*)/(select count(*) from sashelp.cars)
  605.     as udzial_procentowy format percent8.2
  606. from sashelp.cars
  607. group by 1 ;
  608. /* 8 */
  609. /* na podstawie imion czytelników ustalić liczbę czytelników
  610. kobiet i męzczyzn w kazdym mieście oraz udział procentowy */
  611. /* tabela ma zawierac 5 kolumn: miasto, l_kobiet, udział % kobiet,
  612. l_mezczyz, udział % mezczyz */
  613. proc sql;
  614. create table b.miasto_plec as
  615. select adres,
  616. sum(substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE),1)='a')
  617.             as liczba_kobiet,
  618. sum(substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE),1) NE 'a')
  619.             as liczba_mezczyzn,
  620. (calculated liczba_kobiet)/
  621. (calculated liczba_kobiet + calculated liczba_mezczyzn)
  622.             as udzial_pct_kobiet format percent8.2,
  623. (1- calculated udzial_pct_kobiet )
  624.             as udzial_pct_mezczyzn format percent8.2
  625. from b.czytelnik
  626. group by ADRES ;
  627. /* 9 */
  628. /* dla kazdego czytelnika podaj liczbę wypozyczonych
  629. ksiazek w kazdym kwartale 2007 roku */
  630. /* tabela ma mieć 5 kolumn i 58 wierszy(czytelników) */
  631. proc sql;
  632. create table b.wypozyczenia_kwartaly as
  633. select czytelnik_id,
  634.     sum(qtr(DATA_WYPOZYCZENIA)=1) as wyp_kw_1,
  635.     sum(qtr(DATA_WYPOZYCZENIA)=2) as wyp_kw_2,
  636.     sum(qtr(DATA_WYPOZYCZENIA)=3) as wyp_kw_3,
  637.     sum(qtr(DATA_WYPOZYCZENIA)=4) as wyp_kw_4
  638. from b.wypozyczenia
  639. group by 1;
  640. /* 10*/
  641. /* ustal wypozyczone i nieoddane ksiazki
  642. na dzien 1 paźdzernika 2007 roku */
  643. proc sql;
  644. create table b.stan_na_1_paz as
  645. select *
  646. from b.wypozyczenia
  647. where DATA_WYPOZYCZENIA<'01OCT2007'd
  648. and (DATA_ODDANIA>='01OCT2007'd or DATA_ODDANIA=. );
  649.  
  650. /*****************************/
  651. /* 22.10.2018 */
  652. /*****************************/
  653.  
  654. /* 1 */
  655. /* Zlicz czytelników w podziale na płeć */
  656.  
  657. proc sql;
  658. create table b.plec as
  659. select case when
  660. substr(CZYTELNIK_IMIE, length(CZYTELNIK_IMIE),1)='a' then 'K'
  661. else 'M'
  662. end as plec, count(*) as liczba_czytelnikow
  663. from b.czytelnik
  664. group by 1;
  665.  
  666. /* 2 */
  667. /* Dla każdego czytelnika ustal datę ostatniego wypożyczenia
  668. i zlicz liczbę wypożyczonych książek w okresie ostatnich 30 dni */
  669.  
  670. proc sql;
  671. create table b.wypozyczenia_30 as
  672. select CZYTELNIK_ID, count(*) as wypozyczenia_30
  673. from(
  674. select CZYTELNIK_ID, DATA_WYPOZYCZENIA, max(DATA_WYPOZYCZENIA) as MAX_DATA format ddmmyy10.
  675. from b.wypozyczenia
  676. group by CZYTELNIK_ID
  677. having (max(DATA_WYPOZYCZENIA)-30) <= DATA_WYPOZYCZENIA <= (max(DATA_WYPOZYCZENIA))
  678. group by 1;
  679.  
  680. /* 3 */
  681. /* Dla każdego czytelnika podaj średni czas wypożyczenia książki,
  682. w przypadku, gdy książka jest nieoddana wstaw datę 31/12/2007 */
  683.  
  684. proc sql;
  685. create table b.czas_wypozyczenia as
  686. select CZYTELNIK_ID,
  687. ROUND(avg(coalesce(DATA_ODDANIA, '31DEC2007'd) - DATA_WYPOZYCZENIA), 0.1)
  688. as avg_czas_wypozyczenia
  689. from b.wypozyczenia
  690. group by 1;
  691.  
  692. /* 4 */
  693. /* Podaj 10 czytelników z najwyższą liczbą wypożyczeń */
  694. /* W tabeli chcemy: IMIE, NAZWISKO, ADRES, liczba_wypozyczen */
  695.  
  696. proc sql outobs=10;
  697. create table b.top_10 as
  698. select c.CZYTELNIK_IMIE, c.CZYTELNIK_NAZWISKO, c.ADRES,
  699. count(*) as liczba_wypozyczen,
  700. sum( DATA_ODDANIA NE . ) as liczba_oddan
  701. from b.wypozyczenia as w inner join b.czytelnik as c
  702. on w.czytelnik_id=c.id
  703. group by 1,2,3
  704. order by 4 desc
  705. ;
  706. /* 5 */
  707. /* Utworzyć ranking najbardziej poczytnych tytułów
  708. w tabeli podaj tytuł, autora i liczbe wypozyczen */
  709.  
  710. proc sql;
  711. create table b.ranking_tytulow as
  712. select TYTUL, AUTOR_NAZWISKO, count(*) as liczba_wypozyczen,
  713. count(distinct KSIAZKA_SYGNATURA) as liczba_egzemplarzy
  714. from b.KSIAZKA as a, b.WYPOZYCZENIA as w
  715. where a.SYGNATURA=w.KSIAZKA_SYGNATURA
  716. group by 1,2
  717. order by 3 desc;
  718.  
  719. /* 6 */
  720. /* Ustal czytelników, którzy wypożyczyli daną książkę więcej niż jeden raz */
  721.  
  722. proc sql;
  723. create table b.wypozyczenia_ponowne as
  724. select CZYTELNIK_ID, KSIAZKA_SYGNATURA, count(*) as wypozyczenia_ponowne
  725. from b.wypozyczenia
  726. group by 1, 2
  727. having wypozyczenia_ponowne>1;
  728.  
  729. /* 7 */
  730. /* Ustal staz czytelnika w latach i miesiacach
  731. na podstawie daty zapisania do biblioteki */
  732.  
  733. proc sql;
  734. create table b.staz as
  735. select *,
  736. intck('month', DATA_ZAPISU, today()) as staz_mcach,
  737. intck('year', DATA_ZAPISU, today()) as staz_latach
  738. from b.czytelnik;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement