Izracun cijene po danu

Pozdrav,

trebam tablicu u koju imam cijene koje se mijenjaju iz dana u dan.

npr:
01.08.2013 - €40
02.08.2013 - €45
03.08.2013 - €50

Preko formulara bi se birali datumi i trebao bi nekako dobiti zbroj cijena unutar odabranih datuma. Znaci kada odaberes razdoblje od 01.08.2013 do 03.08.2013 trebao bi dobiti zbroj tih triju cijena. Zanima me koja bi bila struktura tablice te kako bi izvlacio vrijednosti.

Da li da svaki datum ima svoju kolonu u tablici (npr.1godina- 365 kolona)? Da li bi ime kolone bilo datum (01-08-2013 ili 01.08.2013) ili pak strtotime() vrijednost datuma ili nesto trece?

Koja bi bila struktura sql upita SELECT SUM( od - do ) as Zbroj?

Hvala

nisam sql majstor ali nešto ovako

id | date | price

1 | date1| 40
2 | date2 |45
3 | date3|50

i onda SELECT SUM(price) as zbroj WHERE date >= date1 AND date<=date3

ili ako datumi nisu u rasponu onda

SELECT SUM(price) as zbroj WHERE date IN (date2,date3,date7)

znaci za svaki produkt da napravim jednu tablicu koja bi imala kolonu datum i cijena. Ok pokusam pa javim

Hmm, nisi spominjao produkte gore u tekstu, nemoj raditi posebnu tablicu za svaki, mozes jednostavno ovoj tablici dodati red product_id pa ih tako povezati.

Možda bi najbolje bilo da nam objasniš koju točno situaciju imaš, i što želiš postići, sigurno ćeš tako dobiti bolji odgovor.

– edit

Obrati pažnju i na dobro podešene indexe, broj redova u tablici će biti 365 x broj proizvoda.

rade se o sobama, 3 razlicite sobe. Svaki dan je druga cijena za svaku. Zelim samo napraviti izlist soba sa total cijenama u recimo gore odabranom preiodu. To je ok sto si mi predlozio samo mi reci sto si mislio sa dobro podesenim indexima?

Mislio sam da se možda radi o tome da će biti velik broj produkata, pa da postavis INDEX na polje product_id jer ćeš po njemu selektirati. Ali budući da se ovdje ne radi o previše upisa nije ni bitno.

Znači sada ćeš imati upit tipa SELECT SUM(price) as zbroj FROM tablica WHERE product_id = IDsobe AND (date >= date1 AND date<=date3)…

Napravi si tablicu kako je dana niže i onda učitaj zapise koje trebaš i algoritamski izračunaj sve što ti treba. Tablice će ti imati malu količinu podataka, kod za ažuriranje podataka i provjeru korisničkog unosa će biti jednostavan (uoči da ti se ne može dogoditi da za neki dan nemaš definiranu cijenu), upis će biti jednostavan. A izračune slobodno vrši u kodu, jer imaš malo podataka - čak i da imaš cijeli hotel, to je još uvijek malo podataka. Ako treba, lako se iz te tablice generira privremena tablica s raspisom po danima (ne bi trebalo, sve se može riješiti SQL-om ili u najgorem slučaju DDL-om, ali ipak).

CREATE TABLE ROOM_PRICE -- RMPR
(
    -- Broj sobe, npr. 101, 203 i sl.
    --
    RMPR_ROOM_NO        INTEGER         NOT NULL
    

    -- Datum od kada važi cijena. Cijena važi od ovog datuma pa do dana
    -- prije slijedećeg većeg datuma za koji postoji zapis.
    --
  , RMPR_DATE           DATE            NOT NULL

  
    -- Cijena. NULL-upis označava početak perioda u kojem se soba ne iznajmljuje.
    --
  , RMPR_PRICE          DECIMAL(5,2)


    -- Primarni ključ. Onemogućuje da ista soba ima dvije cijene s istim
    -- datumom.
    --
  , CONSTRAINT RMPR_PK
    PRIMARY KEY
    (
      RMPR_ROOM_NO
    , RMPR_DATE
    )
    

);

--
-- Soba 101 se od 1. do 6. 8. iznajmljuje za 50 eura, od 7. 8. do 13. 8. za
-- 60 eura, s time da su 8. 8. i 9. 8. iznimnmo 65 eura je taj dan tradicionalna
-- seoska fešta. Od 14. 8. do 20. 8. je cijena 65 eura, od 21. 8. do 27. 8. je
-- 75 eura, a nakon toga je na dalje 70 eura. Od 1. 10. se soba više ne
-- iznajmljuje.
--
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-01', 50 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-07', 60 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-08', 65 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-10', 60 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-14', 65 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-21', 75 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-08-28', 70 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-10-01', NULL );

--
-- Soba 102 se od 1. do 6. 8. iznajmljuje za 30 eura, od 7. 8. do 13. 8. se 
-- vrši zamjena parketa, pa se ne iznajmljuje, od 14. 8. do 20. 8. je cijena 65 
-- eura, od 21. 8. 75 eura. Od 1. 10 se više ne iznajmljuje.
--
INSERT INTO ROOM_PRICE VALUES( 102, '2013-08-01', 30 );
INSERT INTO ROOM_PRICE VALUES( 102, '2013-08-07', NULL );
INSERT INTO ROOM_PRICE VALUES( 102, '2013-08-14', 65 );
INSERT INTO ROOM_PRICE VALUES( 102, '2013-08-21', 75 );
INSERT INTO ROOM_PRICE VALUES( 101, '2013-10-01', NULL );

super, hvala na pomoci,

SELECT SUM(cijena) as zbroj FROM cijene WHERE soba_id= ‘101’ AND (datum >= ‘$dolazak’ AND datum < ‘$odlazak’) to funkcionira.

Treba mi jos jedna stvar, recimo da imam jos jedan stupac “dostupnost” kao dostupnost te sobe za odredjeni datum. Npr. 03.08.2013 dostupnost je 0 tj. soba je izdana.

Na koji nacin u upitu da slozim npr da ako je u odabranom razdoblju 01.08.2013 - 04.08.2013 na bilo koji dan dostupnost 0 da mi ne prikaze zbroj.

probao sam sam MIN (cijena), napravio sam upit koji mi racuna minimalnu cijenu, tako da ukoliko taj upit ranije pronadje da postoji cijena 0 u trazenom periodu ne izvrsava se upit nakon njega. Da li je to optimalno, ne vjerujem ali funkcionira, ako imate savjeta unaprijed hvala.

Evo ti za prvi upit, Sumira sve cijene među odabranim datumima pa ih grupira po broju sobe i nazad vraća listu broja sobe i sumu cijena.

A ovo bi mogao biti drugi upit gdje će ti vratiti nula redova ako između datuma imaš sobu sa dostupnošću 0. Probaj, ne znam dda li je to to što ti je trebalo.

prvi kod je ok, ali u drguome kodu on ne izbacuje sobu iz kalkulacije vec samo ne uracanava dan u kojem je soba zauzeta.

Recimo da trazimo 01.08-05.08, ako je soba u periodu slobodna kod zbraja svih 5 dana.

Ukoliko je na 03.08 soba zauzeta tvoj ovaj kod ce jednostavno izbaciti 03.08 iz kalkulacije te ce zbrajati slobodne dane (4).


Copyright © 2022 WM Forum - AboutContact