Keresés

Részletes keresés

madbazsi Creative Commons License 2010.07.19 0 0 12389
Bocs, hétvégén nem voltam Netközelben. De most vagyok, csináljuk!!!!
SQLkerdes Creative Commons License 2010.07.18 0 0 12388
Madbazsi itt vagy még?
Most jött egy ötletem, hogy hogy lehet esetleg egyszerűbben megoldani a problémát, lehet a jövőhét elején rá tudok szánni egy v. két órát a kisérletezgetésre.

De ha nem vagy itt, akkor nincs értelme.
Előzmény: SQLkerdes (12358)
SQLkerdes Creative Commons License 2010.07.18 0 0 12387
Valóban, úgy tűnik, hogy a SZORZATÖSSZEG-et alaposan átrágtuk számos oldalról.

Hozd a következő gyakorlati problémát és az alapján kiválasztjuk az excel melyik része legyen a következő áldozat :-)
Előzmény: Redlac (12386)
Redlac Creative Commons License 2010.07.18 0 0 12386
Oké!

Azt hiszem, a szorzatösszeg képletet kipipálhatjuk, jöhet a következő lecke :-)
Előzmény: SQLkerdes (12385)
SQLkerdes Creative Commons License 2010.07.18 0 0 12385
Az sem baj, mint ahogy már tapasztaltad is.
Úgy tűnik, nagyobb adat-sokaság esetén a * használata tizedmásodpercben mérhető lassulást okoz.
Előzmény: Redlac (12384)
Redlac Creative Commons License 2010.07.18 0 0 12384
és, ha az összes feltétel?
Mert az általam használt képletben nincs is ;, és mégis jó.
Előzmény: Delila_1 (12382)
Redlac Creative Commons License 2010.07.18 0 0 12383
Valóban! Amikor több órás szenvedés után megvan egy megoldás, az orgazmusközeli állapot:-)

Az utolsó, illetve első negyedéves egyszerűbb meghatározás nagyszerű és logikus ötlet.
Előzmény: SQLkerdes (12375)
Delila_1 Creative Commons License 2010.07.18 0 0 12382
A feltételek *-gal, az összegtartomány ;-vel (angolban ,-vel) követik egymást.
Előzmény: SQLkerdes (12380)
Redlac Creative Commons License 2010.07.18 0 0 12381
Én a csillagok helyett (csak kíváncsiságként:-)) raktam vesszőt, pontosvesszőt, de akkor nem számolt.
SQLkerdes Creative Commons License 2010.07.18 0 0 12380
Nem, mert a 11527-ben pont azt írod, hogy a feltételeket össze kell szorozni. Az én - nagy sokaságon futtatott - tesztjeim viszont azt mutatják, hogy jobb ha nem szorozgatunk a SUMPRODUCT-on belül, hanem odaadjuk neki a számolás minden elemét önálló vektorként.

Persze azt se felejtsük el, hogy 1 millió rekord esetén is csak tizedmásodpercekről beszélünk ;-)
Előzmény: Delila_1 (12309)
SQLkerdes Creative Commons License 2010.07.18 0 0 12379
Ha "csak" százezer sorból áll a tábla, akkor viszont hol a SUM hol a SUMPRODUCT a gyorsabb.
10 kisérletből:
- a SUM gyorsabb 4 esetben (legnagyobb eltérés 14%)
- pontosan azonos időt fut mindkét függvény 4 esetben
- a SUMPRODUCT gyorsabb két esetben (7% legnagyobb eltérés).

Szóval úgy tűnik, hogy "kis" adattábláknál a SUM a jobb megoldás, nagy tábláknál a SUMPRODUCT annyira szétbontva amennyire csak lehet.

Persze jobb lett volna nagyobb mintán kisérletezni, úgy hogy csak egy oprendszer meg az excel fut, de sajnos a világ nem tökéletes :-)
Delila_1 Creative Commons License 2010.07.18 0 0 12378
Eredetileg is így szólt a függvény (#11527, #11459, #9661). :)
Előzmény: SQLkerdes (12376)
SQLkerdes Creative Commons License 2010.07.18 0 0 12377
Ha a SUMPRODUCT-ot szétbontottam úgy, hogy minden egyes elem önálló tömb a számolásban (vagyis nincs szorzásjel a SUMPRODUCT-on belül), akkor egy kicsit még gyorsabb lett.

A függvény amit futtattam:
=SUMPRODUCT(--(YEAR(A2:A1000002)=2010), --(MONTH(A2:A1000002)>=7), --(MONTH(A2:A1000002)<=9), --(C2:C1000002="IGEN"),(B2:B1000002))
SQLkerdes Creative Commons License 2010.07.18 0 0 12376
Csináltam egy gyors kisérletet, ha valakit érdekelnek az ilyen dolgok beteszem ide.

Szóval létrehoztam két táblázatot, mindegyikben 1 millió sorral.
Az egyik táblázatot SUM függvénnyel, a másikat SUMPRODUCT függvénnyel összesítettem számos feltétel mentén.
A függvények:

=SUM((YEAR(A2:A1000002)=2010)* (MONTH(A2:A1000002)>=7)* (MONTH(A2:A1000002)<=9)* (C2:C1000002="IGEN")* (B2:B1000002))
=SUMPRODUCT((YEAR(A2:A1000002)=2010)* (MONTH(A2:A1000002)>=7)* (MONTH(A2:A1000002)<=9)* (C2:C1000002="IGEN")* (B2:B1000002))

Ezekután lemértem, hogy melyik függvény mennyi idő alatt boldogul a számolással. Itt az eredmény:
Jól látszik, hogy a SUMPRODUCT gyorsabb.


Ezek után átalakítottam a SUMPRODUCT függvényt a következőre:
=SUMPRODUCT((YEAR(A2:A1000002)=2010)* (MONTH(A2:A1000002)>=7)* (MONTH(A2:A1000002)<=9)* (C2:C1000002="IGEN"),(B2:B1000002))
A változás annyi, hogy a számokat számoló részt (B2:B1000002) kivettem egy vessző mögé (vagyis egy külön tömböt képeztettem vele.

Ezt összehasonlítottam az első változat SUMPRODUCT-jával (SUMPRIODUCT1 a grafikonon) és ezt kaptam:




A SUMPRODUCT gyorsabb, ha kettébontottam a számolást, különböző vektorokra.
Előzmény: SQLkerdes (12375)
SQLkerdes Creative Commons License 2010.07.18 0 0 12375
Bocsánat a zárójelért...

Mondjuk, nehéz leírni azt a pillanatot amikor néhány óra munka után egy képlet végre elkezdi azt csinálni, amit csinálnia kéne!

Még egy megjegyzés:
Ha a negyedik negyedévet nézed akkor felesleges betennie a: HONAP(datum)<=12 részt, mert ez mindenre igazat ad. Ilyenkor elég csak azt ellenőrzizni, hogy a HONAP(datum)>=10. Nyilvánvaló okokból hasonló logika vonatkozik az első negyedévre is.

Függvények más függvényből való "fejlesztésekor" gyakran előfordul, hogy felesleges feltételek bentmaradnak, mert csak a régi függvényt tartalmát alakítjuk át, nem pedig a működését gondoljuk újra.
Delila_1 Creative Commons License 2010.07.18 0 0 12374
Végül csak sikerült! :)
Előzmény: Redlac (12373)
Redlac Creative Commons License 2010.07.18 0 0 12373
Illetve több feltételnél is működik

=SZORZATÖSSZEG((ÉV(datum)=$C$1)* (HÓNAP(datum)>=7)*(HÓNAP(datum) <=9)*(szolgalat=M3)*(tervezett="IGEN"))
Előzmény: Redlac (12372)
Redlac Creative Commons License 2010.07.18 0 0 12372

Hát ez nehéz szülés volt...

=SZORZATÖSSZEG((ÉV(datum)=$C$1)* (HÓNAP(datum)>=7)*(HÓNAP(datum) <=9)*(szolgalat=M3))

Egy darabig darabig rakosgattam a zárójeleket, mire működött rendesen.
Előzmény: Delila_1 (12371)
Delila_1 Creative Commons License 2010.07.18 0 0 12371
A
=SUM(--(YEAR(Datum)=2000*MONTH(Datum)>=7)* (MONTH(Datum)<=9*(Valami=M3)*(ValamiMas=H5)))

képletből kimaradt egy zárójel a 9 után.
Előzmény: Redlac (12370)
Redlac Creative Commons License 2010.07.18 0 0 12370
hohó...Az előző képlet is ugyanezt csinálja.

A hónaptól függetlenül minden olyan sort megszámol, ahol a másik két változó értéke megvan.
Előzmény: Redlac (12369)
Redlac Creative Commons License 2010.07.18 0 0 12369
Most fogok elővenni valami nagy és nehéz tárgyat, mellyel erőbehatásokat lehet eszközölni a számítógép érzékeny részeire...grrrr
4 órakor kidob az ágy, mert az agyam nem hagy nyugodni és folytatom a táblázatot :-)

Amit ajánlottál:
=SUMPRODUCT(--(YEAR(B13:B16)=2000* MONTH(B13:B16)>=7)*(MONTH(B13:B16)<=9*(F13:F16=M3)*(H13:H16=H5)))

remekül működik...de, csak ezzel a negyedévvel.
Ha a 7 helyett 10-et, a 9 helyett 12-t írok akkor hibásan számol. Konkrétan megszámol mindegyik sort, a hónapoktól függetlenül.
Előzmény: SQLkerdes (12361)
SQLkerdes Creative Commons License 2010.07.17 0 0 12368
Nos, ez túlzás, de nem sértően túlzó :-)
Előzmény: Redlac (12367)
Redlac Creative Commons License 2010.07.17 0 0 12367
Uram!

Megtiszteltetés, hogy Önnel egy topicba írhatok:-)!
Előzmény: SQLkerdes (12366)
SQLkerdes Creative Commons License 2010.07.17 0 0 12366
Már mér ne kéne értened? Úgy látom jelentős időt rászántál arra, hogy a tömbfüggvényekkel foglalkozz és ez egy fontos része.

Szóval, leegyszerűsítve a problémát, mondhatjuk azt, hogy vannak esetek amikor az excel - makacs módon - egy logikai teszt eredményét IGAZ/HAMIS-nak veszi, nem pedig 1/0-nak.

Mivel a tömbfüggvények egyik fontos hasznosítási területe ez, meg kell oldani, hogy pld egy IGAZ értéket egy számmal szorozzunk. Erre szolgál a dupla negatív.

Más szóval: vannak esetek amikor IGAZ*2000 hibát ad. Ekkor lehet a következőt csinálni: --(IGAZ)*2000, és ez már nem hibát jelez, hanem 2000-t ad eredményül.

Mivel lusta vagyok megjegyezni, hogy milyen függvény-környezetben jön elő a hiba, én inkább - szinte - mindíg odateszem a dupla negatívot, abból baj nem lehet.
Előzmény: Redlac (12365)
Redlac Creative Commons License 2010.07.17 0 0 12365
öööö...
"A dupla negatív átváltja a TRUE/FALSE értékeket számmá. "

ez megint egy olyan, amit nem értek, de gyanítom, nem is kell nekem mindent értenem:-)
Előzmény: SQLkerdes (12364)
SQLkerdes Creative Commons License 2010.07.17 0 0 12364
Megszokás...
A dupla negatív átváltja a TRUE/FALSE értékeket számmá. Én mindíg be szoktam rakni a képletekbe, mert lusta vagyok megjegyezni, hogy mikor kell meg mikor nem :-)
Előzmény: Redlac (12363)
Redlac Creative Commons License 2010.07.17 0 0 12363
Ez most már tényleg működik, köszönöm.

A tartomány elnevezéseket már használtam máskor is, itt most nem jutott eszembe.
A képlet elején a 2 kötőjel (--) miért van? Én nem tettem bele és működik.
Előzmény: SQLkerdes (12362)
SQLkerdes Creative Commons License 2010.07.17 0 0 12362
És még egy tanács. Megkönnyíti a formula olvasását (és megírását, ellenőrzését) ha nevet adsz a tartományoknak, amit használsz.

Pld.
Adat!$B$12:$B$2000 legyen Datum
Adat!$F$12:$F$2000 legyen Valami
Adat!$H$12:$H$2000 legyen ValamiMas

Ekkor a függvény a következőképp néz ki:

=SUM(--(YEAR(Datum)=2000*MONTH(Datum)>=7)* (MONTH(Datum)<=9*(Valami=M3)*(ValamiMas=H5)))
SQLkerdes Creative Commons License 2010.07.17 0 0 12361
És bár az először nem működött, most már igen (fene se érti...):

=SUMPRODUCT(--(YEAR(B13:B16)=2000* MONTH(B13:B16)>=7)*(MONTH(B13:B16)<=9*(F13:F16=M3)*(H13:H16=H5)))

Sima ENTER-rel lezárandó.
Vigyázz, nem azonos területekre hivatkozik mint a tied (13:16 vs 12:2000).
SQLkerdes Creative Commons License 2010.07.17 0 0 12360
Ez nekem működik:
=SUM(--(YEAR(B12:B2000)=2000*MONTH(B12:B2000)>=7)* (MONTH(B12:B2000)<=9*(F12:F2000=M3)*(H12:H2000=H5)))
CTRL+SHIFT+ENTER-rel lezárva.

Ez valszeg gyorsabb is mint a lenti, mert mindent csak egyszer kell kiszámolnia (kivéve a hónapot).


Előzmény: Redlac (12359)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!