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

SUM za zadani date range

[es] :: Access :: SUM za zadani date range

[ Pregleda: 2169 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

njosa80
Sarajevo

Član broj: 246181
Poruke: 15
217.199.134.*



Profil

icon SUM za zadani date range12.01.2010. u 15:14 - pre 173 meseci
Ljudi pomagajte.

Naime imam tabelu koja sadrzi 4 kolone. Jedna od kolona je datum a ostale su registarcija poslovnica i gorivo u L itd. Trebao bih da uradim sumu na koloni gorivo u L za određeni vremenski period. Problem je sto kad uradim sumu sve sto se ne moze grupisati( Group by) pojedinacno ispisuje. Imam recimo tri unosa za istu tablicu( registraciju) iz iste poslovnice. Posto imam tri različita datuma u ispisu mi daje ne sumu ta tri vec pojedinačno. U exelu se to zove kao Sum if in date range al tako nesto izgleda da postoji ili postoji a ja to ne znam stoga bih veoma cijenio ako bi mi neko pomogao. Hvala
 
Odgovor na temu

njosa80
Sarajevo

Član broj: 246181
Poruke: 15
217.199.134.*



Profil

icon Re: SUM za zadani date range12.01.2010. u 15:21 - pre 173 meseci
Evo i primjera upita u SQL view-u

SELECT Osnovna.Registracija, Osnovna.Datum, Osnovna.Poslovica, Sum(Osnovna.GorivL) AS SumOfGorivL
FROM Osnovna
GROUP BY Osnovna.Registracija, Osnovna.Datum, Osnovna.Poslovica, Forms!forma!Datum, Forms!forma!Datum1
HAVING (((Osnovna.Datum)>=[Forms]![forma]![Datum] And (Osnovna.Datum)<=[Forms]![forma]![Datum1])) OR (((Osnovna.Datum)<=[Forms]![forma]![Datum1]) AND (([Forms]![forma]![Datum]) Is Null)) OR ((([Forms]![forma]![Datum1]) Is Null));
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: SUM za zadani date range12.01.2010. u 19:42 - pre 173 meseci
Tvoj kveri nije dobro napisan:
Code:

SELECT Osnovna.Registracija, Osnovna.Datum, Osnovna.Poslovica, Sum(Osnovna.GorivL) AS SumOfGorivL
FROM Osnovna
GROUP BY Osnovna.Registracija, Osnovna.Datum, Osnovna.Poslovica, Forms!forma!Datum, Forms!forma!Datum1
HAVING (((Osnovna.Datum)>=[Forms]![forma]![Datum] And (Osnovna.Datum)<=[Forms]![forma]![Datum1])) OR (((Osnovna.Datum)<=[Forms]![forma]![Datum1]) AND (([Forms]![forma]![Datum]) Is Null)) OR ((([Forms]![forma]![Datum1]) Is Null));



Ovaj GROUP BY pocinje od registracije. Znaci sve ce biti grupisano prvo po registraciji (!) pa onda po datumu, pa onda po poslovnici, pa onda po datumima sa forme. Ovo bi moglo teorijski da radi ako bi neko vozilo (Registracija) sipala gorivo vise od jednog puta u jednom danu, sto je malo verovatno. To je jedan razlog zasto dobijas sve rekorde, nema nikakvog grupisanja. Takodje, Forms!forma!Datum, Forms!forma!Datum1 u GROUP BY sedi bez ikakvog razloga. Veoma je moguce da su ti sve vrednosti Osnovna.Datum u tabeli jedinstvene, zbog dela sa satima i minutima, pa i to dovodi do jedinstvenosti (vidi malo nize pricu o cuvanju datuma)

Tebi treba "Trebao bih da uradim sumu na koloni gorivo u L za određeni vremenski period. " Kveri koji odgovara na ovo igleda potpuno drugacije. Ovako nekako:

Code:

SELECT  Osnovna.Poslovica, Osnovna.Registracija, Sum(Osnovna.GorivL) AS SumOfGorivL
FROM Osnovna
WHERE  Osnovna.Datum BETWEEN <PocetniDatum> AND <KrajnjiDatum>
GROUP BY Osnovna.Poslovica, Osnovna.Registracija

Ovo ce ti dati po poslovnici i registraciji ukupnu kolicinu goriva u intervalu (<PocetniDatum>,<KrajnjiDatum>)
Mnogo jednostavnije, zar ne?

HAVING se ne koristi umesto WHERE, HAVING se koristi za poredjenje vrednsoti koje vracaju agregatne funkcije (SUM(), MAX(), MIN(), AVG() i slicno)



Paznja: Access datume cuva kao decimalne brojeve gde je ceo broj datum a decimalni deo je frakcija od 24 sata i presatvlja sate minute i sekunde u tom danu. Ako koristis funkciju Now() da ubacis datum u polje Osnovna.Datum, onda sve vrednosti imaju i decimalni deo.

Kad te decimalne datume poredis sa celim datumima (<PocetniDatum> ,<KrajnjiDatum>) moze se javiti ozbiljna greska. Na primer, neka su <PocetniDatum> = #12 Dec 2009# i krajnji datum = #12 Jan 2010#. Ako u bazi imas vrednost Osnovna.Datum = #12 Jan 2010 15:45# taj daum je veci od #12 Jan 2010#. Izraz BETWEEN <PocetniDatum> AND <KrajnjiDatum> NECE uhvatiti #12 Jan 2010 15:45# , jer #12 Jan 2010 15:45# je veci od #12 Jan 2010#. Takodje izraz Osnovna.Datum<= #12 Jan 2010#. ce promasiti Osnovna.Datum = #12 Jan 2010 15:45# iz istog razloga.

Sad citaj polako i nekoliko puta dok ne psotane jasno

:-)



 
Odgovor na temu

Srbin do jaja

Član broj: 219428
Poruke: 80
*.ptt.rs.



+2 Profil

icon Re: SUM za zadani date range13.01.2010. u 09:14 - pre 173 meseci
a da li mora da cuva datume zajedno sa vremenom? mislim, meni licno bi bilo dovoljno datum kad je sipano gorivo, a tacno vreme kad je sipano mi ne bi bilo bitno.
Nemam pojma šta da stavim u potpis!
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: SUM za zadani date range13.01.2010. u 13:40 - pre 173 meseci
Citat:
a da li mora da cuva datume zajedno sa vremenom?

Ne mora, ali to moras ti da napravis. To zavisi od toga kako unosis datum u kolonu. Ako koristis funkciju Now() unosi se datum+vreme. Ako koristis funkciju Date() pamti se samo datum. Evo ovako:

? date()
13/Jan/2010
? now()
13/Jan/2010 8:36:47 AM


Znaci, pronandji gde se unosi datum u kolonu Osnovna.Datum i promeni da to bde Date() a ne Now(). Moguce je da ti je u definiciji tabele stavljena Deafult Value za kolonu datum na Now(), a moguce je i da na samoj formi gde se unosi datum imas Now(). Potrazi i promeni to.

Ako imas mnogo postojecih podataka sa Datum+Vreme, ovako se odseca vreme, u action UPDATE kveriju:

UPDATE Osnovna SET Datum = INT(Datum)

Nadam se da je pomoglo.

:-)
 
Odgovor na temu

njosa80
Sarajevo

Član broj: 246181
Poruke: 15
217.199.134.*



Profil

icon Re: SUM za zadani date range13.01.2010. u 13:57 - pre 173 meseci
Zidar kralj si:)))) ovih dana zaista listam forume i nigdje nisam vidio da je neko tako precizno opisao rješenje problema. Svaka čast. Pročitao sam i dosao do rješenja koje izgleda ovako:

SELECT Osnovna.Poslovica, Osnovna.Registracija, Sum(Osnovna.GorivL) AS SumOfGorivL
FROM Osnovna
WHERE (((Osnovna.Datum)>=[Forms]![forma]![Datum] Or [Forms]![forma]![Datum] Is Null) AND ((Osnovna.Datum)<=[Forms]![forma]![Datum1] Or [Forms]![forma]![Datum1] Is Null))
GROUP BY Osnovna.Poslovica, Osnovna.Registracija
HAVING (((Osnovna.Poslovica)=[Forms]![forma]![Poslovnica] Or [Forms]![forma]![Poslovnica] Is Null));

Na ono tvoje dodao sam i formu sa combo-boxovima za filterisanje po poslovnici i po date range-u. Posto filterišem i po poslovnici imam i dio HAVING kako si i ti rekao i ako bih htio da filterisem i po registraciji i ona bi upala u HAVING. Sve radi savršeno. E sad što se tiče opcije vremena shvatio sam o čemu pričaš samo nisam siguran da li mi je to potrebno jer sam samo punjeje tabele organizovao preko linked Exel tabela koje automatski pune Osnovna. tabelu u Access-u. Istina još to nisam probao jer mi je ovo testna baza ali kako razmišljam ako je colona u exelu definisan kao datum u formatu 2.5.2010 onda ne bih trebao imati problema sa tim ili mislim da ne bih trebao imati. Jos bih volio da mi kažeš šta misliš o tome? U svakom slucaju ovo rjesenje radi stavio sam ga ciljano da i drugi mogu koristi ukoliko imju potrebe za tim. Zidar Tito si BIG UP:)))
 
Odgovor na temu

Srbin do jaja

Član broj: 219428
Poruke: 80
*.ptt.rs.



+2 Profil

icon Re: SUM za zadani date range13.01.2010. u 16:39 - pre 173 meseci
da da, znam razliku izmedju date() i now(). pitao sam za datum i datum sa vremenom iz prakticnih razloga koje si ti pomenuo. mislim ko da je bitno da li je punjen benzin u 15:34 ili 19:23 istog dana?!

poz
Nemam pojma šta da stavim u potpis!
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: SUM za zadani date range13.01.2010. u 17:09 - pre 173 meseci
Citat:
mislim ko da je bitno da li je punjen benzin u 15:34 ili 19:23 istog dana?!

To ja ne znam, zavsi sta zelis da postignes. Obicno se trazi bas tacno vreme, a u kverijima se racuna sa datumima, ali ne mora da znaci. To je pitanje za onoga za koga pravis program.

Ako ti je dovoljan samo datum, OK, koristi samo datum. Ako ti treba i vreme, radi s avremenom. Onda ces morati malo da podesis WHERE, da dodas 1 dan na desni uslov, ono gde je <=.


Sad sam ti video kveri. Mislim da jos uvek ne razumes razliku izmedju HAVING i WHERE. U WHERE ide sve sto se dogadja pre agregacije. U HAVING idu samo funkcije SUM(), COUNT() i slicno. Istina, Access dozvoljava da stavis u HAVING ono sto inace treba u WHERE, i sve ce da radi. Ali to nije dobro raditi. Sporije radi, mada to verovatno ne primetis. Ukratko, to je bug u Accesu i sasvim slucajno radi kako valja. Drugi razlog je sto razumevanje razlike izmedju WHERE i HAVING omogucuje da se u kverijima urade nezamislive stvari.

Vratimo se tvom kveriju. Umesto

Code:

SELECT   osnovna.poslovica,
         osnovna.registracija,
         Sum(osnovna.gorivl) AS sumofgorivl
FROM     osnovna
WHERE    (((osnovna.datum) >= [Forms]![forma]![Datum]
            OR [Forms]![forma]![Datum] IS NULL)
          AND ((osnovna.datum) <= [Forms]![forma]![Datum1]
                OR [Forms]![forma]![Datum1] IS NULL))
GROUP BY osnovna.poslovica,
         osnovna.registracija
HAVING   (((osnovna.poslovica) = [Forms]![forma]![Poslovnica]
            OR [Forms]![forma]![Poslovnica] IS NULL));

mislim da treba ovako:
Code:

SELECT   osnovna.poslovica,
         osnovna.registracija,
         Sum(osnovna.gorivl) AS sumofgorivl
FROM     osnovna
WHERE    (((osnovna.datum) >= [Forms]![forma]![Datum]
            OR [Forms]![forma]![Datum] IS NULL)
          AND ((osnovna.datum) <= [Forms]![forma]![Datum1]
                OR [Forms]![forma]![Datum1] IS NULL))
         AND (((osnovna.poslovica) = [Forms]![forma]![Poslovnica]
                OR [Forms]![forma]![Poslovnica] IS NULL))
GROUP BY osnovna.poslovica,
         osnovna.registracija



HAVING bi upotrebio da isfiltriras na primer one koji su sipali vise od 500 litara goriva, ovako:

Code:

SELECT   osnovna.poslovica,
         osnovna.registracija,
         Sum(osnovna.gorivl) AS sumofgorivl
FROM     osnovna
WHERE    (((osnovna.datum) >= [Forms]![forma]![Datum]
            OR [Forms]![forma]![Datum] IS NULL)
          AND ((osnovna.datum) <= [Forms]![forma]![Datum1]
                OR [Forms]![forma]![Datum1] IS NULL))
         AND (((osnovna.poslovica) = [Forms]![forma]![Poslovnica]
                OR [Forms]![forma]![Poslovnica] IS NULL))
GROUP BY osnovna.poslovica,
         osnovna.registracija
HAVING   Sum(osnovna.gorivl) > 500



Nadam se da je sada jasno.




 
Odgovor na temu

njosa80
Sarajevo

Član broj: 246181
Poruke: 15
217.199.134.*



Profil

icon Re: SUM za zadani date range14.01.2010. u 07:27 - pre 173 meseci
Pa da sasvim logično da i Forms!forma!poslovnica ide po WHERE. Evo ispravio sam i zaista radi weeeeee:))) Sada si me zaintrigirao sa HAVE jer zaista otvara masu stvari koje se mogu napraviti RESPECT Hvala jos jednom puno. Imam jos jedno pitanje. Napisao sam kod ovako

SELECT Osnovna.Poslovica, Osnovna.Registracija, Sum(Osnovna.GorivL) AS SumOfGorivL
FROM Osnovna
WHERE (((Osnovna.Datum)>=Forms!forma!Datum Or Forms!forma!Datum Is Null) And ((Osnovna.Datum)<=Forms!forma!Datum1 Or Forms!forma!Datum1 Is Null) AND ((Osnovna.Poslovica)=Forms!forma!Poslovnica Or Forms!forma!Poslovnica Is Null))

GROUP BY Osnovna.Poslovica, Osnovna.Registracija

Ono sto se desava da access nakon spasavanja izmjena prosiruje kod na nacin

SELECT Osnovna.Poslovica, Osnovna.Registracija, Sum(Osnovna.GorivL) AS SumOfGorivL
FROM Osnovna
WHERE (((Osnovna.Datum)>=[Forms]![forma]![Datum] And (Osnovna.Datum)<=[Forms]![forma]![Datum1]) AND ((Osnovna.Poslovica)=[Forms]![forma]![Poslovnica])) OR (((Osnovna.Datum)<=[Forms]![forma]![Datum1]) AND ((Osnovna.Poslovica)=[Forms]![forma]![Poslovnica]) AND (([Forms]![forma]![Datum]) Is Null)) OR (((Osnovna.Datum)>=[Forms]![forma]![Datum]) AND ((Osnovna.Poslovica)=[Forms]![forma]![Poslovnica]) AND (([Forms]![forma]![Datum1]) Is Null)) OR (((Osnovna.Poslovica)=[Forms]![forma]![Poslovnica]) AND (([Forms]![forma]![Datum]) Is Null) AND (([Forms]![forma]![Datum1]) Is Null)) OR (((Osnovna.Datum)>=[Forms]![forma]![Datum] And (Osnovna.Datum)<=[Forms]![forma]![Datum1]) AND (([Forms]![forma]![Poslovnica]) Is Null)) OR (((Osnovna.Datum)<=[Forms]![forma]![Datum1]) AND (([Forms]![forma]![Datum]) Is Null) AND (([Forms]![forma]![Poslovnica]) Is Null)) OR (((Osnovna.Datum)>=[Forms]![forma]![Datum]) AND (([Forms]![forma]![Datum1]) Is Null) AND (([Forms]![forma]![Poslovnica]) Is Null)) OR ((([Forms]![forma]![Datum]) Is Null) AND (([Forms]![forma]![Datum1]) Is Null) AND (([Forms]![forma]![Poslovnica]) Is Null))
GROUP BY Osnovna.Poslovica, Osnovna.Registracija;

Zasto se to desava. Sama funkcionalnost je ostala odnosno sve radi kako treba samo je kod izmjenjen. Predpostavljam da su ovo kombinacije tipa ako je jedan uslov nula ostala dva nisu nule ili svi su nule:

Pozzz i tnx
 
Odgovor na temu

njosa80
Sarajevo

Član broj: 246181
Poruke: 15
217.199.134.*



Profil

icon Re: SUM za zadani date range14.01.2010. u 07:43 - pre 173 meseci
I kad sam ponovo pokrenu SQL view sve je bilo po starom znaci kraca varijanta koda... Čudno:)))
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: SUM za zadani date range14.01.2010. u 14:29 - pre 173 meseci
Q:
Citat:
Sada si me zaintrigirao sa HAVE jer zaista otvara masu stvari koje se mogu napraviti RESPECT Hvala jos jednom puno.


Kveriji tipa

SELECT Poslovnica, Vozilo, SUM(PotrosnjaGoriva) AS Potrosnja
GROUP BY Poslovnica, Vozilo
HAVING SUM(PotrosnjaGoriva) > <neki broj>

su samo vrh ledenog brega, jedna zaista najosnovnija mogucnost SQLa, bukvalno kao tablica mnozenja u matematici. Kad jednom naucis tu tablicu mnozenja, mozda ces te posao dovesti do potrebe za necim sto se zove 'relaciono deljenje', gde se prave akrobacije i vratolomije sa HAVING. relaciono deljenj sluzi za resavanja naoko neresivih problema u dobro normalizovanim bazama. Najcesci nrazlog denormalizacije ili nedovoljne normalizacije jeste potreba da se resavaju problemi koji se svode na relaciono deljenje, a programer to ne ume da uradi. Nije sramota sto ne ume, jer nije ni malo lako. Kao kad sa tablice mnozenja skocis na resavanje sitema jednacina, uz potrebu da se resi problem.

Mislim da cu otvoriti novu temu o relacionom deljenu, suvise je dugacko da se ovde objasni.

Q:
Citat:
Ono sto se desava da access nakon spasavanja izmjena prosiruje kod na nacin

Access ima svoj nacin zapisivanja logike kverija. U stvari, access kveriji ne prate 100% SQL standard. Izgleda da postoji neka vrsta prevodioca, pa kad ukucas SQL kod direktno, ponekd zadrzi kod, a li cersce ga promeni u ekvivalentan ali prilicno nerazumljiv kod. Razlog je Accessov graficki prozor za gradjenje kverija. SQL iskaz ce Access uvek prevesti u nesto sto je zgodno (za Access) za prikazivanje u tom prozoru.

U tvom originalnom uslovu imas WHERE (NEsto OR nesto drugo) AND (Nesto OR nesto Drugo). OR i AND se u grafickom Accessovom query designeru prikazuju na razlicite nacine. Ono sto je AND je u jednom redu, ono sto je OR je u drugom redu. AKo WHERE ima niz AND i OR, iz matematike znas da se to uvek moze prearanzirati a d bude ekvivalentno. access tvoj niz AND /OR prevede u neki drugi niz AND/OR ali ne tako da se lakse cita, nego da se lakse prikaze u grafickom Design prozoru.

Otvori kveri u Design grafickom prozoru i razumeces.

Inace, koriscenje Forms!<ime forme>!<ime kontrole> u kverijima nije najbolja praksa, iako je prilicno rasirena. Takvi kveriji su neupotrebljivi ako nije otvorena forma. teski su za citanje i razumevanje (pa jos kad ti Access ispremesta AND/OR logiku).

Ako je svrha ovakvog kverija stampanje reporta, onda je najbolje ostaviti kveri ebz ikakvog WHERE, ili bar bez uslova baziranih na Forms!<ime forme>!<ime kontrole>. Kako onda otvaramo report za trazeni interval? Upotrebimo WhereCondition parametar u komandi DoCmd.OpenReport. Pogledaj Help ili neke primere u knjigama.


U zdravlje i srecan rad

:-)
 
Odgovor na temu

njosa80
Sarajevo

Član broj: 246181
Poruke: 15
217.199.134.*



Profil

icon Re: SUM za zadani date range14.01.2010. u 15:09 - pre 173 meseci
Uhhhhh bas si se potrudio da objasnis RESPECT. Ma da, tako se i osjecam kao na samom pocetku:))) Sto se tiče mjenjanja sql koda meni je bitno da znam kako sam izvorno napisao odnosno da znam sta se vrti ispod. Razlog zasto koristim Forma!forms!... jesto sto sam za pet regionalnih centara napravio exel table koje ono popunjavaju. Kroz access sam napravio uniju tih tabela radi lakse manipulacije. E sad kako je tu velik broj unosa na dnevnoj a samim tim i mjesecnoj osnovi potrebno mi je da filtriram podatke po mjesecu, poslovnici i registraciji. Pogledat cu i ostale opcije oko filtriranja svakako, tek sam poečo da vrtim access tako da bit ce prilike za napredak. Zidar hvala puno:)))
 
Odgovor na temu

Srbin do jaja

Član broj: 219428
Poruke: 80
*.ptt.rs.



+2 Profil

icon Re: SUM za zadani date range14.01.2010. u 18:24 - pre 173 meseci
kakava je razlika izmedju WHERE i HAVING za primer iz ove teme?
Nemam pojma šta da stavim u potpis!
 
Odgovor na temu

Zidar
Canada

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



+79 Profil

icon Re: SUM za zadani date range14.01.2010. u 19:14 - pre 173 meseci
Citat:
Razlog zasto koristim Forma!forms!... jesto

Pazi, nije zabranjeno da se koristi Forma!forms!... Ako funkcionise i uspevas da se ne izgubis u kodu, nema razloag da se na silu odustaje ili zato sto neki pametnjakovic sa foruma kaze da to ne valja. Valja sve sto funkcionise. Ja mislim da imam bar jednu-dve aplikacije koje rade vec godinama i imaju podosta WHERE forms!mojaForma.... uslova. I nista im ne fali i nemam nameru da ih menjam samo zato sto postoji mozda bolji nacin. Jedino u buducnosti pocinjem sa drugim opcijama pa ako bas nista ne pomaze koristim Form!imeforme u kveriju.

Hocu samo da kazem da tu ima mesta za istrazivanje, pa to mozda dovede do boljeg resenja, ali mozda i ne. Samo polako, ucenje je postepen proces, bez obzira sa kog nivoa polazis.

Uzivaj i samo napred

:-)
 
Odgovor na temu

[es] :: Access :: SUM za zadani date range

[ Pregleda: 2169 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

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