Gemiddelde bezetting per maand uitrekenen
Ik ben opzoek naar een manier om de gemiddelde bezetting van een hotel te berekenen in SQL (Liefst Oracle compatible maar anders is MySQL ook goed, dus zonder tussenkomst van PHP of een andere taal!). Nu is het geval dat er kamers bij kunnen komen (bijv door de bijbouw van een nieuw gebouw o.i.d.) Dus er moet eigenlijk per dag gekeken worden wat de bezetting is om aan de hand hiervan een gemiddelde per maand uit te kunnen rekenen.
De desbetreffende tabellen zien er ongeveer als volgt uit:
Kamers: Kamernr, <kamertype>, date_opened, date_closed
Boekingen: Boekingnr, <kamernr>, vanaf_datum, tot_datum
(Bold geeft Primary key, <> geven een foreign key aan)
De meest logische manier lijkt mij om eerst een view te creeeren welke de beschikbaarheid en de bezetting per dag weergeeft. Echter kan ik me niet bedenken hoe ik een view creeer welke per dag een gemiddelde geeft.
Wie heeft er een mooie voorbeeldje voor me?
De desbetreffende tabellen zien er ongeveer als volgt uit:
Kamers: Kamernr, <kamertype>, date_opened, date_closed
Boekingen: Boekingnr, <kamernr>, vanaf_datum, tot_datum
(Bold geeft Primary key, <> geven een foreign key aan)
De meest logische manier lijkt mij om eerst een view te creeeren welke de beschikbaarheid en de bezetting per dag weergeeft. Echter kan ik me niet bedenken hoe ik een view creeer welke per dag een gemiddelde geeft.
Wie heeft er een mooie voorbeeldje voor me?
Ik snap dat je rekening houdt met nieuwe gebouwen.. Maar er komt toch niet elke dag 1 bij ofzo? Kan je het dan niet aanpassen op het moment dat er gebouwd wordt?
Maar als ik nou eens rapportages van verschillende jaren wil vergelijken zouden deze niet meer kloppen ;) Als er meer kamers bijkomen zou de bezettingsgraad dalen over de eerdere jaren.
En uiteindelijk wordt de query ook wel stukje ingewikkelder.. in het voorbeeldje gaat het om kamers van 1 hotel, maar uiteindelijk gaat het over meerdere hotels. Echter is dat niet iets om hier in te verwerken aangezien ik denk dat ik daar wel uit ga komen ;)
En uiteindelijk wordt de query ook wel stukje ingewikkelder.. in het voorbeeldje gaat het om kamers van 1 hotel, maar uiteindelijk gaat het over meerdere hotels. Echter is dat niet iets om hier in te verwerken aangezien ik denk dat ik daar wel uit ga komen ;)
Gewijzigd op 01/01/1970 01:00:00 door Ano Niem
Hoe wil je uberhaupt ouput krijgen zonder hulp van een programmeertaal? Buiten dat, een database is keurig in staat alles zelf te berekenen, het is gewoon een kwestie van goede queries opstellen. Als je Oracle of PGSQL gebruikt kun ook in andere talen (C++, C, PERL) functies schrijven voor de database.
Jurgen: Oracle heeft een perfecte command line tool ;)
En als ik een query heb kan ik deze in een VIEW gieten...
En ik ben dus opzoek naar die juiste query's om op te stellen.
En als ik een query heb kan ik deze in een VIEW gieten...
En ik ben dus opzoek naar die juiste query's om op te stellen.
maar je wilt dus berekenen hoeveel procent van het totaal aantal kamers er ook daadwerkelijk geboekt zijn.
Mjah, het percentage zou hier een proces gegeven zijn van 'kamers geboekt' delen door 'kamers beschikbaar'. Dat percentage berekenen is eitje :P
Waar het mij om gaat is om het aantal geboekte en beschikbare kamers te bereken op elke dag van de maand.
Dagen waarop er geen check-in of check-out plaatsvindt hebben nog wel een bezetting ;) Deze bezetting dient ook meegenomen te worden in de berekening.
Stel dat er 5 van de 10 kamers verhuurd zijn... allen van 21-12-05 tot 31-23-05. Dan wil ik ook voor 22-12-05 zien dat er 5 kamers zijn geboekt.
Waar het mij om gaat is om het aantal geboekte en beschikbare kamers te bereken op elke dag van de maand.
Dagen waarop er geen check-in of check-out plaatsvindt hebben nog wel een bezetting ;) Deze bezetting dient ook meegenomen te worden in de berekening.
Stel dat er 5 van de 10 kamers verhuurd zijn... allen van 21-12-05 tot 31-23-05. Dan wil ik ook voor 22-12-05 zien dat er 5 kamers zijn geboekt.
Quote:
De desbetreffende tabellen zien er ongeveer als volgt uit:
Kamers: Kamernr, <kamertype>, date_opened, date_closed
Boekingen: Boekingnr, <kamernr>, vanaf_datum, tot_datum
(Bold geeft Primary key, <> geven een foreign key aan)
Kamers: Kamernr, <kamertype>, date_opened, date_closed
Boekingen: Boekingnr, <kamernr>, vanaf_datum, tot_datum
(Bold geeft Primary key, <> geven een foreign key aan)
Kan je niet een AVG maken direct zonder die view te maken, subquery's e.d. zijn ook gewoon toegestaan.
Nee, want dan moet ik eerst per dag het aantal geboekte kamers weten.
Ik ga morgen op me werk wel ff de documentatie induiken over procedures en while loopjes in Oracle. Dat is voor mij nog nieuw terrein, maar mogelijk wel de oplossing :)
Ik ga morgen op me werk wel ff de documentatie induiken over procedures en while loopjes in Oracle. Dat is voor mij nog nieuw terrein, maar mogelijk wel de oplossing :)
'Sickness:
Jurgen: Oracle heeft een perfecte command line tool ;)
En als ik een query heb kan ik deze in een VIEW gieten...
En ik ben dus opzoek naar die juiste query's om op te stellen.
En als ik een query heb kan ik deze in een VIEW gieten...
En ik ben dus opzoek naar die juiste query's om op te stellen.
Dat weet ik, maar dit ga je toch niet aan je gebruikers tonen d.m.v. commandline mag ik hopen?
Wie weet, maar als ik nou eens verschillende applicaties wil laten draaien op die ene database ;) Dan moet ik elke keer (voor elke taal iig) opnieuw de afhandeling gaan schrijven? :s
Dit is een onderdeeltje van een project voor school, de applicatie hoeft ik alleen te bouwen mits daar tijd voor is. En alhoewel school waarschijnlijk ook wel akkoord gaat met een halfbakken query is dat niet wat ik in wil leveren.
Dit is een onderdeeltje van een project voor school, de applicatie hoeft ik alleen te bouwen mits daar tijd voor is. En alhoewel school waarschijnlijk ook wel akkoord gaat met een halfbakken query is dat niet wat ik in wil leveren.
Persoonlijk zou ik een extra tabel maken met daarin per datum bijhouden hoeveel kamers er zijn.
Uiteraard niet voor iedere dag een rij, maar alleen als er een kamer/gebouw bij komt een rij toevoegen.
Iets als dit:
Je kan dan (database/php) berekenen hoeveel kamers er in totaal waren.
Dat is even een loopje opzetten.
Aantal dagen heb je zo berekenend.
Aantal kamers (dag * aantal kamers die dag) ook
Aantal kamers/aantal dagen = gemiddelde.
Uiteraard niet voor iedere dag een rij, maar alleen als er een kamer/gebouw bij komt een rij toevoegen.
Iets als dit:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
TABEL KAMERTELLER
id | aantal_kamers | datum
1 28 1-1-1970
2 30 12-12-1987
3 46 4-3-1990
4 123 12-9-1999
5 232 13-10-2008
id | aantal_kamers | datum
1 28 1-1-1970
2 30 12-12-1987
3 46 4-3-1990
4 123 12-9-1999
5 232 13-10-2008
Je kan dan (database/php) berekenen hoeveel kamers er in totaal waren.
Dat is even een loopje opzetten.
Aantal dagen heb je zo berekenend.
Aantal kamers (dag * aantal kamers die dag) ook
Aantal kamers/aantal dagen = gemiddelde.
Bezetting per dag:
Aantal Kamers open gegeven moment = kamers met open_date <= Datum < closed_date
Aantal Geboekt op gegeven moment = boekingen met begin_datum <= Datum < eind_datum
Daarmee moet je in ieder geval het percentage van dag tot dag kunnen berekenen.., die reeks optellen en delen door het aantal dagen in een maand en dan heb je het gemiddelde bezettingspercentage van een maand toch?
Aantal Kamers open gegeven moment = kamers met open_date <= Datum < closed_date
Aantal Geboekt op gegeven moment = boekingen met begin_datum <= Datum < eind_datum
Daarmee moet je in ieder geval het percentage van dag tot dag kunnen berekenen.., die reeks optellen en delen door het aantal dagen in een maand en dan heb je het gemiddelde bezettingspercentage van een maand toch?
Oké nog even voor de duidelijkheid: Ik wil weten hoe ik per dag een gemiddelde krijg alleen m.b.v. SQL. Dus van elke dag een gemiddelde... ook als er geen check-in/out plaatsvind.
Hoe ik gemiddeldes en percentages moet uitrekenen hoef je me echt niet te vertellen. (Joshua) En het bijhouden van hoeveel kamers er zijn in een losse tabel is natuurlijk ook onzin als die informatie gewoon beschikbaar is per kamer. (Eddy)
Ik weet dat het mogelijk is zonder tussenkomst van externe applicaties, de vraag is alleen hoe.
Hoe ik gemiddeldes en percentages moet uitrekenen hoef je me echt niet te vertellen. (Joshua) En het bijhouden van hoeveel kamers er zijn in een losse tabel is natuurlijk ook onzin als die informatie gewoon beschikbaar is per kamer. (Eddy)
Ik weet dat het mogelijk is zonder tussenkomst van externe applicaties, de vraag is alleen hoe.
Post eens je datamodel want ik snap nog steeds niet wat er nu de bedoeling is. Wat ik er wel van snap (de berekeningen) die kunnen allemaal met SQL.
Ik post morgen wel ff het relevante stukje ERD :)
http://img408.imageshack.us/my.php?image=hotellk1.jpg
De queries om gemiddelden op te vragen van een bepaalde lukt me wel:
SELECT (SELECT
COUNT(*)
FROM Kamer k
WHERE TO_DATE(k.van_datum) < SYSDATE
AND TO_DATE(k.tot_datum) > SYSDATE
AND ROWNUM = 1) as "Beschikbaar",
COUNT(*) as "Bezet"
FROM Boeking b
WHERE TO_DATE(b.Boeking_vanaf) < SYSDATE
AND TO_DATE(b.Boeking_tot > SYSDATE;
Nu dus iets om binnen SQL deze query voor elke dag van de maand uit te voeren.
De queries om gemiddelden op te vragen van een bepaalde lukt me wel:
SELECT (SELECT
COUNT(*)
FROM Kamer k
WHERE TO_DATE(k.van_datum) < SYSDATE
AND TO_DATE(k.tot_datum) > SYSDATE
AND ROWNUM = 1) as "Beschikbaar",
COUNT(*) as "Bezet"
FROM Boeking b
WHERE TO_DATE(b.Boeking_vanaf) < SYSDATE
AND TO_DATE(b.Boeking_tot > SYSDATE;
Nu dus iets om binnen SQL deze query voor elke dag van de maand uit te voeren.
Gewijzigd op 01/01/1970 01:00:00 door Ano Niem




