set pagesize 1000 set echo on set markup html on spool on head "BI-DBS - Michal Valenta(valenta) - Výstup SQL příkazů " body "

BI-DBS - středa 14:30, lichý týden, paraleka 1 - Michal Valenta - Výstup SQL příkazů

" spool queries-log.html --KOD DOTAZU: d1 -- Jména zelených lodi. SELECT DISTINCT JMENOL FROM LOD WHERE BARVA = 'zelená'; --KOD DOTAZU: d2 -- Jména zákazníků, kteří si rezervovali alespoň jeden modrý parník. SELECT ZAKAZNIK.JMENOZ, zakaznik.prijmeni FROM ZAKAZNIK JOIN REZERVACE USING(ZID) JOIN LOD USING(LODID) WHERE LOD.LTYP = 'parník' AND LOD.barva= 'modrá'; --KOD DOTAZU: d3 -- Seznam typů lodí, které byly na plavbě s průvodcem. SELECT UNIQUE LTYP FROM LOD L JOIN PLAVBA_S_PRUVODCEM PSP ON(L.LODID= PSP.ID_LOD); --KOD DOTAZU: d4 -- Lodě (všechny atributy), které pokryly nějaké pravidelné spoje a byly také na některé plavbě s průvodcem. SELECT L.* FROM LOD L WHERE L.LODID IN (SELECT LODID FROM POKRYTI P) INTERSECT SELECT L.* FROM LOD L WHERE EXISTS (SELECT 1 FROM PLAVBA_S_PRUVODCEM WHERE PLAVBA_S_PRUVODCEM.ID_LOD = L.LODID); --KOD DOTAZU: d5 -- Lodě, (všechny atributy), které pokryly nějaký pravidelný spj a neby byly na plavbě s průvodcem. SELECT L.* FROM LOD L JOIN POKRYTI P ON (L.LODID = P.LODID) UNION SELECT L.* FROM LOD L JOIN PLAVBA_S_PRUVODCEM P ON (L.LODID = P.ID_LOD); --KOD DOTAZU: d6 -- Lodě (všechny atributy), které nebyly rezervovány SELECT * FROM LOD L WHERE L.LODID NOT IN (SELECT LODID FROM REZERVACE); --KOD DOTAZU: d7 -- Typy lodí, které pokrývají pouze pravidelné spoje. Select distinct LTYP from ( Select L.* FROM LOD L where exists (select LODID from POKRYTI where pokryti.lodid = l.lodid) MINUS Select L2.* FROM LOD L2 where exists (select ID_LOD from PLAVBA_S_PRUVODCEM where plavba_s_pruvodcem.id_lod=l2.lodid ) MINUS Select L.* FROM LOD L where exists (select 1 from REZERVACE R where R.LODID=L.LODID) ); --KOD DOTAZU: d8 -- Zákazníci (id_z, jméno), kteří si rezervovali každou zelenou loď. WITH T1 AS (SELECT LODID,ZID FROM LOD CROSS JOIN ZAKAZNIK WHERE BARVA = 'zelená' ), T2 AS (SELECT UNIQUE LODID,ZID FROM REZERVACE), T31 AS (SELECT * FROM T1 MINUS SELECT * FROM T2), T32 AS (SELECT UNIQUE ZID FROM T31), T4 AS (SELECT UNIQUE ZID FROM REZERVACE), T5 AS (SELECT * From T4 Where T4.ZID Not In (Select ZID From T32)) Select * From T5 Join zakaznik Using(ZID); --KOD DOTAZU: d9 -- Dvojice zákazníků, kteří bydlí na stejné adrese. Select cast(Z1.zid||' '||Z1.jmenoz||' '||Z1.prijmeni||' sousedí s '|| Z2.zid||' '||Z2.jmenoz||' '||Z1.prijmeni as varchar(60)) as sousede From zakaznik Z1 Join zakaznik Z2 On (Z1.adresa=Z2.adresa and Z1.zid < Z2.zid); --KOD DOTAZU: d10 -- Průměrný věk lodníků. Select ROUND(AVG(vek),2) From namornik; --KOD DOTAZU: d11 -- Cekový počet typů lodí, počet různých typů lodí a celkový počet míst na všech lodích. Select count(distinct ltyp) pocet_typu_lodi , count(distinct barva) pocet_ruznych_barev , sum(pocet_mist) celkovy_pocet_mist From LOD; --KOD DOTAZU: d12 -- Lodníci, kteří byli na plavbě s průvodcem méně, než 4 krát. Select * From namornik N Where (Select count(*) From PLAVBA_S_PRUVODCEM PSP Where N.nid = PSP.nid) < 4; -- alternativni reseni Select nid,N.JMENON,N.VEK,N.HODNOST,N.PLAT From namornik N Left Outer join PLAVBA_S_PRUVODCEM P Using(nid) GROUP BY nid, N.JMENON, N.VEK, N.HODNOST, N.PLAT Having count(ID_LOD) < 4; --KOD DOTAZU: d13 -- Lodníci, kteří pokryli méně než 3 různé pravidelné linky včetně těch, kteří nepokryli žádnou. Select N.*, (Select count(DISTINCT LID) From pokryti P Where P.nid = N.nid) pocet_ruznych_linek From namornik N Where (Select count(DISTINCT LID) From pokryti P Where P.nid = N.nid) < 3; -- alternativni reseni SELECT NID,N.JMENON,N.VEK,N.HODNOST,N.PLAT,COUNT(LODID) FROM NAMORNIK N Left Outer Join POKRYTI P Using (Nid) GROUP BY NID,N.JMENON,N.VEK,N.HODNOST,N.PLAT Having count (LODID) < 3; --KOD DOTAZU: d14 -- Pro každého lodníka počet jeho plaveb s průvodcem. Select N.*, (Select count(*) From PLAVBA_S_PRUVODCEM PSP Where N.nid = PSP.nid) pocet_PSP From namornik N; -- alternativa Select nid,N.JMENON,N.VEK,N.HODNOST,N.PLAT, count(ID_LOD) pocet_PSP From namornik N Left Outer join PLAVBA_S_PRUVODCEM P Using(nid) GROUP BY nid, N.JMENON, N.VEK, N.HODNOST, N.PLAT; --KOD DOTAZU: d15 -- Jména lodníků mladších 40 let, kteří mají za sebou alespoň 3 plavby s průvodcem na lodi typu klipr. Výstup bude seřazen dle jmen lodníků. Select N.nid,N.JMENON From Namornik N Where (Select count(*) From PLAVBA_S_PRUVODCEM PSP Join LOD L On(LODID= ID_LOD) Where PSP.nid = N.nid and L.Ltyp ='klipr' ) >=3 and N.vek <40 order by N.JMENON desc; -- alternativa Select nid,N.JMENON From Namornik N Join PLAVBA_S_PRUVODCEM PSP Using (nid) Join lod L On (LODID= ID_LOD) Where L.Ltyp ='klipr' and N.vek <40 Group By nid,N.JMENON having count(*) >= 3 order by N.JMENON desc; --KOD DOTAZU: d16 -- Námořníkům, kteří mají za sebou alespoň 4 pokrytí spoje zvedněte plat o 15%. Update namornik N Set plat = plat * 1.15 where (Select count (lodid) From pokryti P Where P.nid = N.nid) > 4; --KOD DOTAZU: d17 -- K tabulce LODNIK přidám sloupec pocet_plaveb_s_pruvodcem a provedu jednorázový dopočet hodnot tohoto sloupce. -- pridani sloupce Alter Table NAMORNIK Add (pocet_plaveb_s_pruvodcem integer Default 0); -- dopocitani Update namornik N Set pocet_plaveb_s_pruvodcem = (Select count(*) From PLAVBA_S_PRUVODCEM PSP Where PSP.nid=N.nid); Commit; -- overeni select * from namornik; -- uklid alter table namornik drop column pocet_plaveb_s_pruvodcem; select * from namornik; --KOD DOTAZU: d18 -- Zákazníci, kteří si rezervovali každý parník s počtem míst větším než 150. set echo on -- podivejme se na data jmenovatele select * from zakaznik; select LODID from lod where ltyp='parník' and POCET_MIST > 150; -- jak vidno, budeme dělit prázdnou relací with T1 as (select distinct zid,lodid from REZERVACE) , T2 as (select zid,lodid from (Select ZID from ZAKAZNIK) cross join (select LODID from lod where LTYP= 'parník'and POCET_MIST > 150) ) , T3 as (select zid,lodid from T2 minus select zid,lodid from T1) , T4 as ( select distinct ZID from rezervace MINUS select distinct zid from T3 ) Select * from zakaznik Z natural join T4; --KOD DOTAZU: d19 -- Vytvoření pohledu se seznamem spojů, u nichž budou podrobnosti jejich linek. create or replace view vspoj as select lid,linka.strt,linka.cil, spoj.spid, spoj.scas from spoj natural join linka order by lid,spoj.scas; -- vyber vsechny spoje, ktere by jely dnes po 12. hodine select strt, cil, trunc(current_date) + scas as kdy from vspoj where trunc(current_date) + scas > trunc(current_date) + INTERVAL '12' HOUR(2) order by scas; --KOD DOTAZU: d20 -- Kteří lodníci sloužili na jednotlivých lodích? select distinct lod.lodid,n.nid From lod left outer join (SELECT distinct NID, LODID FROM POKRYTI union SELECT unique NID, id_lod FROM PLAVBA_S_PRUVODCEM) A on (lod.lodid=A.lodid) right outer join namornik N on (A.nid=N.nid) order by lodid, nid; --KOD DOTAZU: d21 -- Seznam rezervací včetně lodí, které nebyly rezervovány a zákazníků, kteří si nic nerezervovali. SELECT REZERVACE.DATUM_RES, ZAKAZNIK.ZID, ZAKAZNIK.JMENOZ, ZAKAZNIK.PRIJMENI, ZAKAZNIK.CREDITLIMIT, ZAKAZNIK.ADRESA, LOD.LODID, LOD.JMENOL, LOD.BARVA, LOD.LTYP, LOD.POCET_MIST FROM ZAKAZNIK LEFT OUTER JOIN REZERVACE ON ZAKAZNIK.ZID = REZERVACE.ZID FULL OUTER JOIN LOD ON LOD.LODID = REZERVACE.LODID order by datum_res, zakaznik.prijmeni,zakaznik.jmenoz,lod.jmenol; --KOD DOTAZU: d22 -- Seznam linek, které jsou pokryty pouze autobusem SPZ101 -- Seznam linek, které jsou pokryty pouze autobusem SPZ101 SELECT distinct LINKA.LID, STRT,CIL FROM LINKA INNER JOIN SPOJ ON LINKA.LID = SPOJ.LID INNER JOIN POKRYTI ON SPOJ.LID = POKRYTI.LID AND SPOJ.SPID = POKRYTI.SPID INNER JOIN AUTOBUS ON AUTOBUS.INV_CISLO = POKRYTI.INV_CISLO AND SPZ='SPZ101' MINUS SELECT distinct LINKA.LID, STRT,CIL FROM LINKA INNER JOIN SPOJ ON LINKA.LID = SPOJ.LID INNER JOIN POKRYTI ON SPOJ.LID = POKRYTI.LID AND SPOJ.SPID = POKRYTI.SPID INNER JOIN AUTOBUS ON AUTOBUS.INV_CISLO = POKRYTI.INV_CISLO AND SPZ != 'SPZ101'; --KOD DOTAZU: d23 -- Seznam námořníků, kteří jsou volní dne 23.09.2013 od 8 do 14 hod. alter session set nls_date_format = 'dd.mm.yyyy hh24:mi'; select * from namornik where nid in ( select distinct nid from kalendar_namornika where od not in ('23.09.2013 08:00', '23.09.2013 14:00') ); --KOD DOTAZU: d24 -- Seznam lodí, které jsou volné dne 23.09.2013 od 8 do 14 hod. a mají kapacitu od 10 do 25 míst. alter session set nls_date_format = 'dd.mm.yyyy hh24:mi'; select distinct lodid from lod l1 where lodid not in (select lodid from rezervace where datum_res = '23.09.2013') and not exists (select lodid from pokryti p where l1.lodid = p.lodid and p.DATUM_POKRYTI = '23.09.2013' and ( p.od in ('23.09.2013 08:00', '23.09.2013 14:00') or p.do in ('23.09.2013 08:00', '23.09.2013 14:00') ) ) and l1.pocet_mist in (10,25); --KOD DOTAZU: d25 -- Přidejte novou plavbu s průvodcem pro zákazníka s příjmením Scott a jménem Scott na 23.09.2013 od 8 do 14 hod. -- Nasaďte na to loď, která je na tu dobu volná a má kapacitu 10 až 25 míst. -- Nasaďte na to kteréhokoliv námořníka, který je na tuto dobu volný. alter session set nls_date_format = 'dd.mm.yyyy hh24:mi'; -- set autocommit off -- nejdrive je nutne vyplnit kalendar namornika INSERT INTO KALENDAR_NAMORNIKA (NID,OD,DO) VALUES( (select nid from kalendar_namornika where od not in ('23.09.2013 08:00', '23.09.2013 14:00') and rownum =1 ), '23.09.2013 08:00', '23.09.2013 14:00' ); -- zaplanovani plavby INSERT INTO PLAVBA_S_PRUVODCEM( NID,OD,DO,ID_LOD,ZID) VALUES ( (select nid from kalendar_namornika where od ='23.09.2013 08:00' and do= '23.09.2013 14:00' and rownum=1 ), '23.09.2013 08:00', '23.09.2013 14:00', ( select distinct lodid from lod l1 where lodid not in ( select lodid from rezervace where datum_res = '23.09.2013') and not exists ( select lodid from pokryti p where l1.lodid = p.lodid and p.DATUM_POKRYTI = '23.09.2013' and ( p.od in ('23.09.2013 08:00', '23.09.2013 14:00') or p.do in ('23.09.2013 08:00', '23.09.2013 14:00') ) ) and l1.pocet_mist in (10,25) and rownum = 1 ), ( SELECT ZID FROM ZAKAZNIK WHERE prijmeni='Scott' and jmenoz='Scott' and rownum=1 ) ); rollback; set markup html off spool off