Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Još jedna mozgalica o datumima

[es] :: Access :: Još jedna mozgalica o datumima

Strane: 1 2

[ Pregleda: 4781 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Još jedna mozgalica o datumima01.09.2009. u 11:47 - pre 178 meseci
U prilogu je baza sa podacima. Treba izvući broj noćenja po državama za određeni period.

Npr:

ukupno sifra_drzava naziv
26 1 Hrvatska
26 2 Italija
21 3 Srbija


F
Prikačeni fajlovi
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
213.244.209.*

Sajt: biske.rs


+39 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 13:25 - pre 178 meseci
Najpre je potrebno napraviti jedan upit koji izracunava broj nocenja za svakog gosta. Evo SQL koda:

Code:
SELECT sifra, (datum_odjave-datum_prijave) AS broj_nocenja
FROM tblGosti;


Zatim je potrebno napisati upit sumira vrednosti broja nocenja gostiju za svaku zemlju pojedinačno. Evo i tog koda:

Code:
SELECT d.sifra AS [Sifra drzave], d.naziv AS [Naziv drzave], Sum(n.broj_nocenja) AS [Broj nocenja]
FROM (qryBroj_nocenja_gosta AS n INNER JOIN tblGosti AS g ON n.sifra = g.sifra) INNER JOIN
         tblDrzave AS d ON g.sifra_drzava = d.sifra
WHERE (((g.datum_prijave)>[Unesite pocetni datum]) AND ((g.datum_odjave)<[Unesite krajnji datum]))
GROUP BY d.sifra, d.naziv;



Pritom se u drugi upit takozvani parametarski upit gde ne znamo unapred parametre upita vec to unosi korisnik. Ja sam uneo za pocetni datum 1/1/2008 a za krajnji datum 1/1/2010 i dobio sam sledeći rezultat:


Prikačeni fajlovi
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 13:39 - pre 178 meseci
Citat:
biske86: Najpre je potrebno napraviti jedan upit koji izracunava broj nocenja za svakog gosta. Evo SQL koda:

Code:
SELECT sifra, (datum_odjave-datum_prijave) AS broj_nocenja
FROM tblGosti;



Ovdje ćeš dobiti ukupan broj noćenja po gostu, ali ne traži se ukupan broj noćenja po gostu već za određeni period. Dakle, ako je npr.
datum_odjave = 20.09.2009 a
datum_prijave = 10.09.2009

ti ćeš dobiti da je broj noćenja 10, šro nije točno ako ja tražim broj noćenja od npr. 01.01.2009 do 15.09.2009.

Citat:


Zatim je potrebno napisati upit sumira vrednosti broja nocenja gostiju za svaku zemlju pojedinačno. Evo i tog koda:

Code:
SELECT d.sifra AS [Sifra drzave], d.naziv AS [Naziv drzave], Sum(n.broj_nocenja) AS [Broj nocenja]
FROM (qryBroj_nocenja_gosta AS n INNER JOIN tblGosti AS g ON n.sifra = g.sifra) INNER JOIN
         tblDrzave AS d ON g.sifra_drzava = d.sifra
WHERE (((g.datum_prijave)>[Unesite pocetni datum]) AND ((g.datum_odjave)<[Unesite krajnji datum]))
GROUP BY d.sifra, d.naziv;



Pritom se u drugi upit takozvani parametarski upit gde ne znamo unapred parametre upita vec to unosi korisnik. Ja sam uneo za pocetni datum 1/1/2008 a za krajnji datum 1/1/2010 i dobio sam sledeći rezultat:



Tvoj rezultat je (pretpostavljam na temelju upita, nisam provjeravao) točan za taj period koji si zadao. Ali probaj unesti period od npr. 15.09.2009 do 25.09.2009 i vidjeti ćeš da ti rezultat nije točan.

Ovaj dio

Code:
(((g.datum_prijave)>[Unesite pocetni datum]) AND ((g.datum_odjave)<[Unesite krajnji datum]))


će ti odmah u startu izbaciti goste čiji je boravak započeo prije pocetnog datuma kojeg unese korisnik i dobiti ćeš krivi rezultat.

Npr. ako upišem parametre 15.09.2009 - 25.09.2009 neću dobiti niti jedan record kao rezultat query-a, što nije točno.

Idemo dalje
F
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
213.244.208.*

Sajt: biske.rs


+39 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 16:12 - pre 178 meseci
Skontao sam gde sam pogrešio i onda sam na papiru ispravio prvi upit. On je bitan. Na papiru mi logika izgleda dobro ali neće akses da ga prihvati. Evo koda:

SELECT sifra, (IIf(((datum_prijave>pocetni_interval) And (datum_odjave<krajnji_interval)),(datum_odjave-datum_prijave),IIf(((datum_prijave>pocetni_interval) And (datum_odjave>krajnji_interval)),(krajnji_interval-datum_prijave),IIf(((datum_prijave<pocetni_interval) And (datum_odjave>krajnji_interval)),(krajnji_interval-pocetni_interval),(datum_odjave-pocetni_interval))))) AS broj_nocenja
FROM tblGosti;

Evo greške:




očigledno da je formula prevelika. Ima li leka ovom problemu u Accessu?


Prikačeni fajlovi
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 16:56 - pre 178 meseci
Hmm, da budem iskren, teško mi je pročitati upit, makar mislim da znam šta si želio postići. Na dobrom si putu koliko sam shvatio, slično sam ja napravio. Kao šta access kaže, treba pojednostaviti upit Da ti pomognem, probaj svaki iif napisati zasebno i onda raditi sumiranje. Također mislim da ti fali jedan uvjet, tj. nisi pokrio sve mogućnosti.
I fali ti grupiranje po državama, sa ovim upitom (da radi) bi dobio samo broj noćenja po gostima u traženom periodu. Trebaš napraviti join na te dvije tablice.
F
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
213.244.209.*

Sajt: biske.rs


+39 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 17:24 - pre 178 meseci
Slažem se da je potreban jos jedan slučaj da pokrije a to je kad se ova dva intervala ne poklapaju treba vratiti nulu.
Naravno da fali, samo sam hteo prvo da rešim ovaj problem.

Ja se predajem pošto nemam vremena jer spremam ispit iz Orakla. Inače u Oraklu je moguće veoma jednostavno rešiti ovakvu stvar. Neverovatno je kakvu kontrolu pruža pri manipulaciji podacima.

Ako ti nije problem pošalji mi rešenje na mail, da ne otkrivamo na forumu pošto možda neko hoće sam da reši ovo.
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 17:42 - pre 178 meseci
Poslao sam ti rješenje na mail. Volio bih viditi još pokušaja/rješenja, ali očito se nikome ne da :-(
Zidar, Getsbi?
F
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 17:45 - pre 178 meseci
Ako imamo zadat period, prvo treba da utvrdimo koji gosti su bili prijavljeni u tom periodu. To je ono sto monstruozni izraz sa IIF pokusava da postigne. Lakse je ako se logika smesti u WHERE deo iskaza nego u SELECT, ali nije nsita manje monstruzono.

Ajde da nacrtamo sliku, vremensku osu i neke intervale, recimo [---] predstavlja interval kada je gost bio prijavljen. Evo 4 itervala kad smo imali goste:

---------[----]-------[----]--------[------]------[------]-------------> vreme

Oznacimo s {----} interval u kome posmatramo nasu osu, ovako:

---------[----]--{-----[----]--------[---}---]-------[------]-------------> vreme

Ovde imamo da prvi i poslednji [] interval ne upadaju u trazeni period, drugi upada ceo a treci samo delimicno. Moguce su mnoge druge kombinacije. Lakse ce biti da posmatramo samo jedan interval [] i jedan interval {} tipa. Koji su sve moguci odnosi?

Ako je [ = X ]=y i { = A i } = B mozmeo da kazemo:

Slika 1), moguci slucajevi poklapanja intervala:

-------[----{---]---}-----> [X,Y] se preklapa sa {A,B} jer je X<A<Y<B

-------[---{--}--]---------> [X,Y] se preklapa sa {A,B} je je {A,B} ceo unutar [X,Y]

-------{---[----}---]------> [X,Y] s epreklapa sa {A,B} jer je A<X<B<Y

-------{---[---]----}------> [X,Y] se preklapa sa {A,B} jer je ceo [X,Y] unutar {A,B}

To je to sto se tice preklapanja, nema vise slucajeva. Naravno da bismo mogli uvek da napisemo ovakav izraz koji ce pokazati intervale [X,Y] koji se preklapaju sa {A,B}

SELECT
X,Y
FROM NekaTabela
WHERE (X<A AND Y<B)
OR (X <A AND A<B AND B<Y)
OR (A<X AND X<B AND B<Y)
OR (A < X AND X<Y AND Y<B)

Lepo. Ali moze lakse. Nartajmo sliku koja pokazuje kada se dva intervala NE PREKLAPAJU. Postoje samo dva moguca slucaja:


Sklika 2, slucajevi kada se intervali NE preklapaju:
-------{-----}-----[-----]------> {A,B} je ceo ispred [X,Y]

-------[------]----{-----}------> {A,B} je ceo iza [X,Y]

Ovako pokazujemo intervale koji se NE preklapaju sa A,B:
SELECT
X,Y
FROM NekaTabela
WHERE B<X OR A>Y

Ako primenimo NOT operator, intervale koji se preklapaju mozemo dobiti ovako:

SELECT
X,Y
FROM NekaTabela
WHERE NOT(B<X OR A>Y)


Sve sto treba zapamtiti jeste slika 2.

Idemo na konkretan primer, u zakacenoj bazi. Zelim da vidim sve goste koji su bili prijavljeni u intervalu {A,B} = {#1 Sep 2009#,#15 Sep 2009#}. Intervali [X,Y] su u kolonama [datum_Priojave, Datum_odjave]

Svi gosti koji su bili prijavljeni u intervalu {#1 Sep 2009#, #15 Sep 2009#} dobijaju se ovako:

SELECT
*
FROM tblGosti
WHERE NOT (#15 Sep 2009# < Datum_Prijave OR #1 Sep 2009#>Datum_Odjave)

Dalje je lako, COUNT(*) sa GROUP BY po sifri drzave.

Sve u svemu:
Code:

SELECT tblGosti.Sifra, tblGosti.Sifra_Drzava, tblGosti.Ime, tblGosti.Datum_odjave, tblGosti.Datum_prijave
FROM tblGosti
WHERE  NOT ([Pocetak Intervala]>[tblGosti].[Datum_odjave] OR tblGosti.Datum_prijave>[Kraj Intervala]);


ili ovo
Code:

SELECT tblGosti.Sifra_Drzava, Count(*) AS BrojGostiju
FROM tblGosti
WHERE  NOT ([Pocetak Intervala]>[tblGosti].[Datum_odjave] OR tblGosti.Datum_prijave>[Kraj Intervala])
GROUP BY tblGosti.Sifra_Drzava;


Zakaceni primer daje za nijansu lepse izlazne rezultete - vidi se preiood za koji brojimo goste.












Prikačeni fajlovi
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 17:57 - pre 178 meseci
Svaka čast na lijepom objašnjenju! I rješenje je kratko i jednostavno (za rezultat koji se dobije).

Ali...

Mislim da me nisi dobro shvatio, traži se broj noćenja po državama, a ne broj gostiju po državama koji su boravili u određenom periodu. Pogledaj moj rezultat upita u prvom postu. Dakle, koliko dana su gosti grupirani po državama boravili u određenom periodu.

Ili sam ja krivo shvatio tvoj odgovor?
F
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 18:13 - pre 178 meseci
@ captpicard

Ti si u pravu, tacno, nisam dobro citao zadatak. Ono sto sam dao je pola resenja. Vazan doe, kako se posmatraju intervali ali nedovoljan za ovaj zadatak. Broj nocenja mzoe da se dobije nadovezivanjem na ovo sto sam pokazao, a moze i na drugi nacin. Pogledacu sta moze da se uradi.

U medjuvremenu, mozda dobijemo jos resenja.
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
213.244.209.*

Sajt: biske.rs


+39 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 18:57 - pre 178 meseci
Pogledao sam rešenje..Međutim nešto mi drugo pade na pamet. Šta mislite o uniji. Evo ova unija daje za svakog čitaoca koliko je imao noćenja u datom intervalu. I ona prikazuje korektno rezultate.

Code:
SELECT sifra, IIf(((datum_prijave>pocetni_interval) And (datum_odjave<krajnji_interval)), (datum_odjave-datum_prijave), 0) AS broj_nocenja
FROM tblGosti;
UNION ALL SELECT sifra, IIf(((datum_prijave>pocetni_interval) And (datum_odjave>krajnji_interval)), (krajnji_interval-datum_prijave), 0) as broj_nocenja
FROM tblGosti;



Međutim sledeća unija iako je ista po strukturi kao prethodna, prijavljuje istu grešku kao malopre, da mi je formula veoma kompleksna..

Code:

SELECT sifra, IIf(((datum_prijave<pocetni_interval) And (datum_odjave>krajnji_interval)), (krajnji_interval-pocetni_interval), 0) AS broj_nocenja
FROM tblGosti;
UNION ALL SELECT sifra, IIF(((datum_prijave<pocetni_interval) and (datum_odjave<krajnji_interval)), (datum_odjave-pocetni_interval), 0) as broj_nocenja
from tblGosti;


Mislio sam da napravim novi upit koji bi opet bio unija prethodna dva. Dalje bi bilo potrebno da se napravi još četvrti upit koji bi samo sumirao data polja broj_nocenja iz trećeg. Međutim kao što rekoh iz nekog razloga neće da radi drugi upit.
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 18:57 - pre 178 meseci
Resenje koje se nadovezuje na preklapanje intervala:

qryPreklapanjeIntervala:
Code:
PARAMETERS Od DateTime, Do DateTime;
SELECT [Od] AS PeriodOD, [Do] AS PeriodDo, tblGosti.Sifra, tblGosti.Sifra_Drzava, tblGosti.Ime, tblGosti.Datum_odjave, tblGosti.Datum_prijave
FROM tblGosti
WHERE ((([OD]>[Datum_odjave] Or [Datum_prijave]>[Do])=False));


Na osnovu qryPreklapanjeIntervala sledi qryPreklapanjeIntervalaBrojNocenja
Code:

SELECT PeriodOD, PeriodDo, Sifra, Sifra_Drzava, Ime, Datum_odjave, Datum_prijave, IIf([PeriodOd]>[Datum_Prijave],[PeriodOD],[Datum_Prijave]) AS LevaGranica, IIf([Datum_Odjave]<[PeriodDO],[Datum_Odjave],[periodDo]) AS DesnaGranica, IIf([Datum_Odjave]<[PeriodDO],[Datum_Odjave],[periodDo])-IIf([PeriodOd]>[Datum_Prijave],[PeriodOD],[Datum_Prijave])+1 AS BrojNocenja
FROM qryPreklapanjeIntervala;


i odavde imamo trivijalan kveri qryBrojNocenjaPoDrzavi :
Code:

SELECT PeriodOD, PeriodDo, Sifra_Drzava, Sum(BrojNocenja) AS SumOfBrojNocenja
FROM qryPreklapanjeIntervalaBrojNocenja
GROUP BY PeriodOD, PeriodDo, Sifra_Drzava;


Prikačeni fajlovi
 
Odgovor na temu

biske86
Ivan Biševac
Zubin Potok

Član broj: 62435
Poruke: 979
213.244.209.*

Sajt: biske.rs


+39 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 19:19 - pre 178 meseci
Skinuo sam ovu bazu i uneo početni interval 1/1/2009 a krajnji 12/12/2009 i prikazuje mi da Hrvatska ima 93 noćenja. Međutim Hrvatska ukupno ima 88 noćenja. Takođe za isti interval Italija ima kod tebe ima 100 noćenja dok stvarno postoje samo 95. Srbija ima 73 a stvarno postoji 68 noćenja. Očigledno u tvojim upitima ima po 5 noćenja viška. Ponavlja se za sve zemlje tako da predstavlja zakonitost. Verovatno je neka sitnija greška u kodu..
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 19:36 - pre 178 meseci
Citat:
biske86: Pogledao sam rešenje..Međutim nešto mi drugo pade na pamet. Šta mislite o uniji. Evo ova unija daje za svakog čitaoca koliko je imao noćenja u datom intervalu. I ona prikazuje korektno rezultate.

Code:
SELECT sifra, IIf(((datum_prijave>pocetni_interval) And (datum_odjave<krajnji_interval)), (datum_odjave-datum_prijave), 0) AS broj_nocenja
FROM tblGosti;
UNION ALL SELECT sifra, IIf(((datum_prijave>pocetni_interval) And (datum_odjave>krajnji_interval)), (krajnji_interval-datum_prijave), 0) as broj_nocenja
FROM tblGosti;


Ovo je jako slično onom mojem rješenju koje sam ti poslao, u stvari case zamjenjuje union all. Ako dodaš sum i grupiraš po državama, mislim da bi trebao dobiti rješenje. Naravno, treba dodati još dva uvjeta iz drugog query-a, a zašto daje grešku na drugom qurey-u stvarno ne znam...

F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 19:42 - pre 178 meseci
Citat:
biske86: Skinuo sam ovu bazu i uneo početni interval 1/1/2009 a krajnji 12/12/2009 i prikazuje mi da Hrvatska ima 93 noćenja. Međutim Hrvatska ukupno ima 88 noćenja. Takođe za isti interval Italija ima kod tebe ima 100 noćenja dok stvarno postoje samo 95. Srbija ima 73 a stvarno postoji 68 noćenja. Očigledno u tvojim upitima ima po 5 noćenja viška. Ponavlja se za sve zemlje tako da predstavlja zakonitost. Verovatno je neka sitnija greška u kodu..


Treba iz ovog query-a izbaciti +1

Code:
SELECT PeriodOD, PeriodDo, Sifra, Sifra_Drzava, Ime, Datum_odjave, Datum_prijave, IIf([PeriodOd]>[Datum_Prijave],[PeriodOD],[Datum_Prijave]) AS LevaGranica, IIf([Datum_Odjave]<[PeriodDO],[Datum_Odjave],[periodDo]) AS DesnaGranica, IIf([Datum_Odjave]<[PeriodDO],[Datum_Odjave],[periodDo])-IIf([PeriodOd]>[Datum_Prijave],[PeriodOD],[Datum_Prijave])+1 AS BrojNocenja
FROM qryPreklapanjeIntervala;


naime, igrom slučaja sam ja u test bazu ubacio za svaku državu 5 zapisa, pa se na svako noćenje dodaje +1 noć što je krivo. Ne znam zašto je Zidar ubacio taj +1, ali ako se njega makne, dobije se ispravan rezultat.

dakle, ovako:

Code:
SELECT PeriodOD, PeriodDo, Sifra, Sifra_Drzava, Ime, Datum_odjave, Datum_prijave, IIf([PeriodOd]>[Datum_Prijave],[PeriodOD],[Datum_Prijave]) AS LevaGranica, IIf([Datum_Odjave]<[PeriodDO],[Datum_Odjave],[periodDo]) AS DesnaGranica, IIf([Datum_Odjave]<[PeriodDO],[Datum_Odjave],[periodDo])-IIf([PeriodOd]>[Datum_Prijave],[PeriodOD],[Datum_Prijave]) AS BrojNocenja
FROM qryPreklapanjeIntervala;


Bravo za Zidara

Samo da napomenem, ja sam napravio rješenje u jednom query-u, ako želite ću ga odmah napisati, ili ako želite još malo rješavati, ću kasnije...

U svakom slučaju, puno se može naučiti na ovakav način. Svaka čast Zidar!

p.s. baš me zanim da li se može onaj zadatak sa iznajmljivanjem automobila riješiti u jednom upitu...
F
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 19:50 - pre 178 meseci
Izmena zakacenog fajla: nisam bio siguran da li je zakaceni fajl bio dobar, nasao sam gresku u brojanju dok sam testirai query CaptPicarda. Stoga sam izmenio zakaceni fajl.

Greska je zbog nacina na koji brojim nocenje. Ja brojim i poslednji dan, a poslednji dan se ne noci, covek se odjavljuje tog dana. Popravicu.

U medjuvremenu evo mnogo jednostavnijeg resenja. Koristi se tabel datuma. Tu negde ovih dana bese jedna tema gde je Getsbi resavao zauzece automobila pomocu tabele datuma. Elem, napravi se tabela koja ima sve datume u nekom intervalu. Moja ima sve datume uod 200 do kraja 2017 godine.

Onda se tblGosti 'razvije' na individualne dane. Svako Od-Do se razvije na konkretne dane. Dobro, razvije se na intrevalu (Datum_Prijave, Datum_Odjave -1), posto brojimo nocenja a ne dane kad je gost bio prisutan. Posle to sto smo razvili grupisemo po drzavi i prebrojimo.



[Ovu poruku je menjao Zidar dana 01.09.2009. u 21:49 GMT+1]
Prikačeni fajlovi
 
Odgovor na temu

Zidar
Canada

Moderator
Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 20:07 - pre 178 meseci
Bravo za CaptPicard i Biske


Biske, svaka cast za proveru rezultata. Veoma profesionalno.
Capt. je ispravio gresku u kveriju, svka cast. +1 dodje kad se broje dani u intervalu. Bez +1 poslednji dan se ne racuna, a to je bas sto je trebalo. Prilozi i resenje sa jednim kverijem, bolje manje kverija nego vise, sva dok mozemo to sve da nekako razumemo.

Sta mislite o resenju sa tabelom datuma? Mnogo manje kavriaj i mnogo su jednostavniji.

 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 20:08 - pre 178 meseci
Citat:
Zidar: Greska je zbog nacina na koji brojim nocenje. Ja brojim i poslednji dan, a poslednji dan se ne noci, covek se odjavljuje tog dana. Popravicu.

I medjuvremenu evo mnogo jednostavnijeg resenja. Koristi se tabel datuma. Tu negde ovih dana bese jedna tema gde je Getsbi resavao zauzece automobila pomocu tabele datuma. Elem, napravi se tabela koja ima sve datume u nekom intervalu. Moja ima sve datume uod 200 do kraja 2017 godine.

Onda se tblGosti 'razvije' na individualne dane. Svako Od-Do se razvije na konkretne dane. Dobro, razvije se na intrevalu (Datum_Prijave, Datum_Odjave -1), posto brojimo nocenja a ne dane kad je gost bio prisutan. Posle to sto smo razvili grupisemo po drzavi i prebrojimo.


Lijepo riješeno. Ovo je super za prikaz kalendara zauzeća soba!

Da dam svoje rješenje, ili da još pričekam?
F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 20:12 - pre 178 meseci
Citat:
Zidar: Bravo za CaptPicard i Biske :-)


Biske, svaka cast za proveru rezultata. Veoma profesionalno.
Capt. je ispravio gresku u kveriju, svka cast. +1 dodje kad se broje dani u intervalu. Bez +1 poslednji dan se ne racuna, a to je bas sto je trebalo. Prilozi i resenje sa jednim kverijem, bolje manje kverija nego vise, sva dok mozemo to sve da nekako razumemo.

Sta mislite o resenju sa tabelom datuma? Mnogo manje kavriaj i mnogo su jednostavniji.

:-)


Evo, baš sam ti odgovorio na drugi post. Rješenje sa datumima je odlično, idealno za prikazivanje zauzeća po sobama u kalendaru. Vidiš, ja sam bio lijen pa sam iskoristio neku 3rd party komponentu za te prikaze, a sa ovim query-em bi to mogao sam napraviti. Svaka čast, stvarno!
U svakom slučaju, ja sam puno naučio iz Zidarovim odgovora. Hvala!


F
 
Odgovor na temu

captPicard
programer
more i planine

Član broj: 216084
Poruke: 1119



+19 Profil

icon Re: Još jedna mozgalica o datumima01.09.2009. u 20:16 - pre 178 meseci
Sorry, tek sada sam vidio da si napisao da dam rješenje.

Evo ga:

Code:
select ukupno, sifra_drzava, naziv from (
select (sum(aa)+sum(cc)+sum(dd)+sum(ee)) as UKUPNO, sifra_drzava, naziv from(select
(iif( aaa>0, aaa , 0)) as aa,
(iif( ccc>0,ccc, 0)) as cc,
(iif( ddd>0, ddd, 0)) as dd,
(iif( eee>0, eee, 0)) as ee,
sifra_drzava, naziv  from(
select SUM(A) as aaa, SUM(C) as ccc, SUM(D) as ddd, sum(e) as eee, sifra_drzava, naziv FROM (SELECT  sifra_drzava, naziv,
(iif( (datum_prijave >= :datumod and datum_odjave<:datumdo) , datediff("d",datum_prijave,datum_odjave), 0 )) as a,
(iif( (datum_prijave < :datumod and datum_odjave<=:datumdo) , datediff("d",:datumod,datum_odjave) ,0 )) as c,
(iif( (datum_prijave <= :datumod and datum_odjave>=:datumdo), datediff("d",:datumod,:datumdo) ,0 )) as d,
(iif( (datum_prijave > :datumod and datum_odjave=:datumdo),datediff("d",datum_prijave,:datumdo), 0 )) as e
from tblGosti as c, tblDrzave as d where c.sifra_drzava=d.sifra )group by sifra_drzava, naziv))group by sifra_drzava, naziv)
where ukupno <> 0


Isto sam bio malo lijen pa nisam optimizirao upit . Može se napisati sa dva seta sum-a manje tako da se prije svakog iif-a stavi sum umjesto onog sum(aa)... i sum(A)... ali stvarno sam umoran i ne da mi se sada prepravljati. Nadam se da se ne ljutite Ako nekome treba, napraviti ću.
F
 
Odgovor na temu

[es] :: Access :: Još jedna mozgalica o datumima

Strane: 1 2

[ Pregleda: 4781 | Odgovora: 22 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.