Databázy - cvičenie - 9. týždeň
Created: 2008-11-19 - 16:42
/* Uvazujme polikliniku. Najdite id takych pacientov, ich krstne mena, mesacne prijmy a id lekara, ktori u lekara nezaplatili ziaden poplatok. Vratte aj priemernu sumu penazi, ktora vychadza na jedneho prislusnika s tym, ze v pripade ak pacientov mes. prijem >= 20 000, tak ma 4 clennu rodinu, ak je jeho prijem >= 10 000 ale mensi ako 20 000, tak ma 2-clennu rodinu, inak je to student (staci vratit jeho mes. prijem) */ use poliklinika go select p.idp,p.krstne,p.mesPrijem,l.idl Lekar,priemNaClenaRodiny = case when mesPrijem >=20000 then mesPrijem/4 when mesPrijem >=10000 and mesPrijem<20000 then mesPrijem/2 else mesPrijem end from navstevy n join pacienti p on p.idp=n.idp join lekari l on l.idl=n.idl where poplatok is null /* Vedenie polikliniky potrebuje vytvoriť finančnú analýzu tržieb za posledný rok. Chcú zistiť, ktorý mesiac v roku je najvyťaženejší a podľa toho určovať poplatky za vyšetrenia. Napriek tomu, že bola prevádzka spustená len v máji chcú mať v tabuľke zvlášť riadok pre každý mesiac roka. Takže prvý stĺpec bude tvoriť poradie mesiaca v roku, v ďalších bude počet ľudí, ktorí v danom mesiaci navštívili polikliniku, zisk v danom mesiaci, percentuálny podiel zisku v danom mesiaci ku celkovému zisku a nakoniec celkový zisk. Keďže je to len predbežný výstup, ktorý sa bude neskôr formátovať, sú prípustné aj NULL hodnoty. */ use poliklinika go create table mesiace (id int); declare @id int; set @id = 1; while @id <= 12 begin insert into mesiace values (@id); set @id = @id + 1; end select m.id 'Mesiac', count(idP) 'Pocet ludi', sum(poplatok) 'Zisk v mesiaci', cast( cast(sum(poplatok) as float) / cast((select sum(poplatok) from navstevy) as float)*100 as decimal) '%', (select sum(poplatok) from navstevy) 'Celkovy zisk' from navstevy n1 right outer join mesiace m on m.id = month(n1.den) group by m.id drop table mesiace /* Najdite informacie o lekarovi, ktory v mesiaci maj osetril pacienta, ktory mal najvyssi mesacny prijem spomedzi vsetkych pacientov, ktori boli v maji u lekara. */ select l.* from lekari l join navstevy n on n.idl = l.idl join pacienti p on p.idp = n.idp where month(n.den) = 5 and p.mesPrijem = ( select max(mesPrijem) from pacienti p1 join navstevy n1 on n1.idp = p1.idp where month(n1.den)=5); /* Vratte mena pacientov, ktori navstivili lekara v parny mesiac a zaplatili poplatok mensi ako 350. */ select distinct p.krstne from pacienti p join navstevy n on p.idp = n.idp where month(n.den)%2 = 0 and poplatok < 350 /* spanielske veci */