L?sningsforslag til ?vingsoppgaver INF1300 uke 29/10 - 2/11 ------------------------------------------------------------ Oppg 1. a) select h.hotellnr, h.hotellnavn, count(r.romnr) from hotell h, rom r where h.hotellnr = r.hotellnr group by h.hotellnr, h.hotellnavn having count(r.romnr) > 30; b) ? ?ke en pris med 5% er det samme som ? gange den med 1.05. Dette skal vi gj?re for enkeltrommene p? hotellet Oslo Plaza, dvs. i de forekomster som har et romnr som er et enkeltrom p? Oslo Plaza (den f?rste select-grenen), samtidig som de har et hotellnr som stemmer overens med navnet Oslo Plaza (den andre select-grenen). P? gruppe?velsen gjorde jeg den feilen ? utelate den siste delen ('and hotellnr in ...' osv), noe som selsagt f?rte til at _alle_ forekomster med et romnr som passet overens med de jeg valgte ut i den f?rste selecten ble oppdatert - uansett hvilket hotell de h?rte til. Hvilket heldigvis ble lagt merke til av observante studenter :o) update Rom set pris = (1.05 * pris) where romnr in (select r.romnr from rom r, hotell h where h.hotellnr = r.hotellnr and h.hotellnavn like 'Oslo Plaza' and r.type like 'enkel') and hotellnr in (select h.hotellnr from hotellh where h.hotellnavn like 'Oslo Plaza'); c) Ved hjelp av group by i den indre select-setningen teller vi for hvert hotell opp antall bestillinger som har sin start i oktober 2007 (fraDato i oktober 2007). Deretter kj?res en select p? resultat-relasjonen av denne igjen (best?r n? av hotellnr, antBestillinger), hvor vi regner ut snittet av antall bestillinger (avg(antBestillinger)). select avg(antBestillinger) as snittOktober from (select b.hotellnr, count(b.hotellnr) as antBestillinger from bestilling b where (b.fradato >= '2007-10-01' and b.fradato <= '2007-10-31') group by b.hotellnr) as x; ?nsker vi ? regne med alle bestillinger som har toutchet innom oktober m? linjen 'or (b.tildato >= '2007-10-01' and b.tildato <='2007-10-31')' legges til i where-klausulen. Merk at vi her kun regner med hoteller som faktisk har minst en bestilling i l?pet av oktober. d) For hver ulike romtype teller vi opp antall ganger en slik har v?rt bestilt, men kun for bestillinger p? hoteller som ligger i Oslo. select r.type as romtype, count(r.type) as antall from bestilling b, rom r, hotell h where h.by like 'Oslo' and h.hotellnr = b.hotellnr and b.hotellnr = r.hotellnr and b.romnr = r.romnr group by r.type order by antall desc; e) Den tapte inntekten pr. hotell finner vi ved ? summere opp d?gnrisen for alle rom som ikke er i bestilling i dag (current_date). Merk her at det grupperes p? b?de hotellnr og hotellnavn, i en select med group by m? attributtene som projiseres enten forekomme i en aggregerende funksjon (som count) eller atributtet m? forekomme i group by-delen. For ? ?ke lesbarheten i svaret kan det v?re greit ? ha med hotellnavnet, men i denne oppgaven kan vi ikke gruppere kun p? navn siden flere hoteller kan ha samme navn (typisk i ulike byer). select r.hotellnr, h.hotellnavn, sum(r.pris) from rom r, hotell h where r.hotellnr = h.hotellnr and r.romnr not in (select b.romnr from bestilling b, hotell h where fradato <= current_date and tildato >= current_date and b.hotellnr = h.hotellnr) group by r.hotellnr, h.hotellnavn; f) create view gjesteliste as select h.hotellnavn, g.gjestnavn from hotell h, gjest g, bestilling b where h.hotellnr = b.hotellnr and b.gjestnr = g.gjestnr and b.fradato <= current_date and b.tildato >=current_date; g) Vanskeligheten i denne oppgaven best?r i hvordan finne antall d?gn en person som sjekker ut har overnattet, samt regne ut totalbel?pet vedkommende skal betale. Siden vi kan regne p? datoer er denne biten ogs? grei (f.eks. vil current_date + 1 gi morgendagens dato). tildato - fradato gir oss antall d?gn, og multipliseres antall d?gn med prisen p? rommet har vi totalbel?pet. create view regningsliste as select g.gjestnr, g.gjestnavn, g.gjestadresse, (b.tildato-b.fradato) as Antalld?gn, r.pris as Prisprd?gn, r.pris * (b.tildato-b.fradato) as SUM from Gjest g, Bestilling b, Hotell h, Rom r where h.hotellnavn like 'Oslo Plaza' and g.gjestnr = b.gjestnr and r.romnr = b.romnr and r.hotellnr = b.hotellnr and b.hotellnr = h.hotellnr and b.tildato = current_date; Oppg 2 ------ Her f?lger l?sningen p? selve sql-koden, Java-koden finnes i egen fil. Er dere interessert i flere muligheter/metoder for selectering og presentasjon av resultater enn det som st?r i l?reboka om bruk av Java, anbefales Java-API-et som finnes p? Sun sine sider: http://java.sun.com/javase/6/docs/api/ Spesielt er pakken java.sql interessant. a) select count(distinct l?nn) from ansatt; b) select pl.pnr, p.pnavn, count(pl.anr) from prosjekt p, prosjektplan pl, ansatt a, avdeling avd where avd.anavn like 'Utvikling' and p.pnr = pl.pnr and pl.anr = a.anr and avd.avdnr = a.avdnr group by pl.pnr, p.pnavn; c) insert into prosjektplan (pnr, anr, timer) values ((select pnr from prosjekt where pnavn like 'Aksjeb?rs'), (select anr from ansatt where navn like 'K?re Hansen'), 15);