Dátum szerinti csoportosítás, érték összeadás

Dátum szerinti csoportosítás, érték összeadás
2018-11-17T15:32:35+01:00
2018-11-18T10:13:39+01:00
2022-10-15T21:36:07+02:00
Roluzan
Sziasztok!

Szeretném a bevételt havi bontással ki iratni. Mivel több valuta is található így nem adhatom egyszerűen össze az eurót és a forintot queryben.

PHP ban szeretném vagyis úgy láttam célszerűnek hogy abban váltom át az Eurót forintra majd adom össze az értékeket az adott hónapra és itt akadtam el.

sql: 

SELECT currency , date , price FROM ( SELECT server, currency, price, date FROM log_paypal UNION ALL SELECT server, currency, price, date FROM log_mastercard UNION ALL SELECT server, currency, price, date FROM log_transfer UNION ALL SELECT currency, price, date FROM log_sms ) AS t WHERE YEAR(t.date) = YEAR(CURDATE()) GROUP BY MONTH(t.date), currency
PhP:

foreach($query as $currency) { for ($i=10; $i<=12; $i++) { if(date('m', strtotime($currency['date'])) == $i) { $total += $currency['price'] ; } echo $total ; } }


Három árfolyam van, Euró(EUR), Dollár(USD) és Forint(HUF).
Erre a hónapra van mind a háromból teszem azt, de nem a teljes összesget adja vissza, hanem mindig hozzá adja a következőhöz.
Ha tehát az euro 100 a dollár is 100 és a forint 500, akkor nem 700 lesz erre a hónapra hanem 100, 200, 700. 3 értéket kapok egy helyett. 

Előre is köszönöm a segítséget.
Mutasd a teljes hozzászólást!

  • Szia!

    A SELECT-ből hiányzik a SUM(price) , és szintén a SELECT-ben  nem lehet "date" mező, hanem

    MONTH(t.date) AS honap kell helyette, mivel a GROUP BY-ban is az van. (Ha hónaponként összevonod, akkor a SELECT-ben nem lehet napi dátum, azért mert hónapra összevontad.)
    A SELECT helyesen így lenne:

    SELECT currency, MONTH(t.date) AS honap, SUM(price) AS osszesen FROM ( SELECT server, currency, price, date FROM log_paypal UNION ALL SELECT server, currency, price, date FROM log_mastercard UNION ALL SELECT server, currency, price, date FROM log_transfer UNION ALL SELECT currency, price, date FROM log_sms ) AS t WHERE YEAR(t.date) = YEAR(CURDATE()) GROUP BY currency, MONTH(t.date) Ha így megcsinálod a lekérdezést, akkor az eredmény havi összesítés pénznemenkénti bontásban. Ha ezek után forintosítani akarod, akkor kell, hogy legyen havi árfolyamod a különböző pénznemekhez. Van havi árfolyamod? Ha forintosítani kell, én még az összevonás előtt forintosítanám az adott naphoz tartozó árfolyammal, és utána összesíteném havi bontásban. Akkor viszont már a GROUP BY-ba és a SELECT-be nem kell a "currency"
    Mutasd a teljes hozzászólást!
  • Köszönöm a választ, nem a query a gond, az működik csak át variáltam itt hibásra mint látszik, kicsit fáradt vagyok most értem haza a munkából :D

    Tehát a queryben összeadja külön az eut erre a hónapra, a forintot is, azzal nincs gond.
    Az a baj hogy foreach ciklusban nem tudom rendesen össze adni hogy például ebben a hónapban, adja össze az 500 eurót (persze egy fügvénybe megy ami vissza adja már a huf értéket)
    a forintal és a végösszeg maradjon.

               foreach($query as $currency)
               {
                    // 12 hónap
                    for ($i=1; $i<=12; $i++)
                    {
                             // lekérdezett hónap = az adott hónappal ha igen adja össze
                            if(date('m', strtotime($currency['date'])) == $i)
                             {
                                        $total += arfolyam($currency['price'] ) ;   // vissza jön az érték és össze adódik
                              }
                              echo $total ;     // nem egy összeget ad vissza hanem a fentebb leírt módon
                    }
               }



    Próbáltam queryben is megoldani, hogy rögtön ott számítsa át és ott adja össze, de még annyi sikerrel se jártam és abban se vagyok biztos hogy melyik az erőforrást kímálőbb módszer.

    Egy kép a lekérdezésről
    Screenshot
    Mutasd a teljes hozzászólást!
  • Szia!

    Szerintem az "echo $total" sorod rossz helyen van, ezért írja ki többször az összesen sort. Annak a legvégén, a foreach ciklus vége után kellene lenni... 

    vagy nem értem, hogy mi a probléma...

    Az árfolyam függvény egyébként jól számol?
    Mutasd a teljes hozzászólást!
  • igen jól számol, ha a foreach után teszem akkor össze adja az egész évet. Egy végösszeget kapok az adott évre.
    Én minden hónapra szeretném külön hogy az adott hónapban mennyi volt a bevétel.
    Mutasd a teljes hozzászólást!
  • Én minden hónapra szeretném külön hogy az adott hónapban mennyi volt a bevétel.

    Kezdem érteni, hogy mit szeretnél...

    Ehhez először az kellene, hogy hónap szerint legyen sorban az eredmény. Ehhez elég lesz, hogy a GROUP BY-ban felcseréled a currency és a hónap mezőket, hogy a hónap legyen elől, és utána a pénznem. 

    Ezután egy ciklussal végig tudsz menni úgy az eredményen, hogy a létrehozol a cikluson belül még egy ciklust. Ahol a ciklus előtt elmented a hónapot, és a ciklus feltétel az lesz, hogy addig menjen, amíg a mentett hónap megegyezik az aktuális rekord hónapjával. Ezen a cikluson belül végzed el a forintosítást és a halmozást a  $total változóban. Majd amikor ennek a ciklusnak vége, kiiratod a totál értékét.  Ezután kezdődik elölről a ciklus, most már a következő hónappal.
    Arra még figyelni kell, hogy a $total értékét a nullázni kell a második ciklus indulásakor, hogy mindig csak az adott hónap összesítését tartalmazza.

    A PHP-t nem ismerem, úgyhogy csak az elvet tudtam leírni, a konkrét kódot nem.
    Mutasd a teljes hozzászólást!
  • Sajnos a tudásom eddig tartott, nem tudom php ban hogyan tudnám ezt kivitelezni.
    foreach után próbáltam egy for ciklust ahol az i a hónap ami ha egyenlő az adatbázis hónapjával akkor össze adja, de ugyan úgy ki írja mind a három pénznem bevételét az adott hónapra. Próbáltam while ciklust de az végtelenbe pörög while( month == i ).

    Semmi elképzelésem sincs.

    Még ha meglehetne oldani hogy queryben végezze át a számításokat és már ott adja össze, az se a legjobb megoldás, mert lehet a jövőben több pénznem lesz, és akkor manuálisan kéne bővíteni, így pedig a fügvényemben automatikusan át számol minden beérkező összeget.

    De köszönöm a segítséged!

    $total=0;
    foreach($query as $curreny )
    {
    $date = $curreny['date'];
    $month = date('m', strtotime($date));

    // ez a hónap Screenshot
    if($month == 11)
    {
    $total += $curreny['price'] ;
    }

    echo $total ; // ki írja mind a 3 értéket ahelyett hogy össze adva egy értéket kapnék
    // eredeti értékek 200 6800 2000
    // input : 200 7000 9000 
    // ahogy lennie kéne input : 9000
    }
    Mutasd a teljes hozzászólást!
  • Szia!

    A PHP-ból annyit értek, hogy látom, hogy hol a hiba, viszont annyira nem ismerem, hogy a kész megoldást ideírjam. De itt egy elvi megoldás, amit bármilyen nyelve át tudsz "fordítani":

    $Total = 0 do while !eof() // ciklus amíg nem érünk a végére $HonapTotal = 0 $AktualisHonap = date('m', strtotime($date)); // elmentjük az aktuális tételhez tartozó hónapot, és utána a következő ciklusban addig megyünk, amíg az eltárolt érték megegyezik az aktuális tétel hónapjával do while $AktualisHonap = az aktuális rekordhoz tartozó hónap AND !eof() // ciklus amíg nincsen hónap váltás, és nem értünk a végére $HonapTotal += forintosított érték // itt halmozod a forintosított értéket havonta, előtte árfolyamot számolsz, ahogyan most is teszed $Total += forintosított érték // itt halmozod a forintosított értéket teljes összesen rekord mutató léptetése enddo echo $HonapTotal // itt írod ki a hónap összesítést. ezután a ciklus visszamegy a "$HonapTotal = 0" sorra, és jöhet a következő hónap összesítése enddo echo $Total // itt pedig ki tudod iratni a teljes összesent
    Mutasd a teljes hozzászólást!
  • Szia!

    Az előző leírásom alapján nem jönne össze, akkor tedd fel még egyszer a kérdést a tudástárban

    "Egymás ágyazott ciklusok PHP-ban" vagy valami hasonló címmel. Mutasd meg az SQL lekérdezés  eredménynek a képét, amit összesíteni kell havi bontásban. Aki ismeri a PHP-t annak kb. 2 perc  a megoldás.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd