Árváltozás figyelése

Árváltozás figyelése
2008-12-16T16:46:40+01:00
2008-12-17T10:30:41+01:00
2022-11-11T22:45:32+01:00
pantomin
Sziasztok!
A következő problémával küzdök.
Adott egy tábla, ami a termékek adatait tartalmazza (id, név, méret, súly, fogyasztási ár), adott egy másik tábla, ami a termék mozgásokat tartalmazza (bizonylat id, dátum, beszerzési ár, kedvezmény, termékmozgás iránya - mármint aszerint, hogy a készlet emelkedett, vagy csökkent).
Szeretnék írni egy olyan lekérdezést, ami egy adott időszakra megmutatja, hogy a termékek beszerzési ára mennyi volt, és mennyi fogyott belőlük.
A beszerzési árral vagyok gondban.
Tehát: ha egy termék ára november elején változott, akkor az októbertől decemberig tartó időszakban történt fogyást bontanom kell. Az október elején érvényes beszerzési áron hány darab fogyott, és a november elejétől december végéig érvényes beszerzési áron mennyi fogyott.
A kérdésem, egyáltalán lehetséges-e pusztán MySQL lekérdezéssel, vagy pedig vb.netből kell ciklusokkal kutakodnom? Ha lehetséges, akkor valamilyen kiindulási pontot tudtok-e adni?
Köszönöm szépen.
Mutasd a teljes hozzászólást!
Egy ilyen:

SELECT Tábla1_1.id, Max(Tábla1.id) AS MaxOfid FROM Tábla1 INNER JOIN Tábla1 AS Tábla1_1 ON (Tábla1.dátum < Tábla1_1.dátum) AND (Tábla1.progID = Tábla1_1.progID) WHERE (((Tábla1.mozgas)=1) AND ((Tábla1_1.mozgas)=2)) GROUP BY Tábla1_1.id
Megmondja, hogy melyik eladás melyik beszerzéshez kapcsolódik.

mozgás=1 : beszerzés
mozgás=2 : eladás
Nincs azonos dátum, mert adátum mezőben pontos idő is van (egy napon belül több beérkezés), de persze lehet = is.

És ezt a lekérdezést használod egy másikban:
SELECT Tábla1.*, Tábla1_1.ár, Tábla1_1.dátum, Tábla1.dátum FROM ( SELECT Tábla1_1.id, Max(Tábla1.id) AS MaxOfid FROM Tábla1 INNER JOIN Tábla1 AS Tábla1_1 ON (Tábla1.dátum < Tábla1_1.dátum) AND (Tábla1.progID = Tábla1_1.progID) WHERE (((Tábla1.mozgas)=1) AND ((Tábla1_1.mozgas)=2)) GROUP BY Tábla1_1.id ) áraz1 INNER JOIN Tábla1 ON áraz1.id = Tábla1.id) INNER JOIN Tábla1 AS Tábla1_1 ON áraz1.MaxOfid = Tábla1_1.id WHERE (((Tábla1.dátum)>[Tábla1_1].[dátum]));
Mutasd a teljes hozzászólást!

  • Egy subquery sokat segíthet.

    Minden adathoz kapcsold hozzá a nála kisebb id-jú legnagyobb id, bevételezés értékét arra a termékre. (Persze id helyett lehet a dátum)
    Így lesz egy lekérdezésed, amiben 2 ár lesz.

    Mutasd a teljes hozzászólást!
  • Kedves Micu!
    Bevallom őszintén, ezt nem nagyon értem.
    Azt le tudom kérdezni, hogy történt-e árváltozás.
    Ha történt, akkor a periódus első napja előtti max(datum)hoz tartozó beszer.árral kell számoljak, és ez még nem is lenne baj. Azt nem tudom, hogyan kell bontanom, hogy az árváltozás utáni beszer árakat is tegye bele a fogyás listába.
    Mutasd a teljes hozzászólást!
  • Bocsi, de itt valami nem gömbölyű..(nekem)
    Írod:
    1. Adott egy tábla, ami a termékek adatait tartalmazza (id, név, méret, súly, fogyasztási ár)
    2. adott egy másik tábla, ami a termék mozgásokat tartalmazza (bizonylat id, dátum, beszerzési ár, kedvezmény, termékmozgás iránya

    és

    3. Azt le tudom kérdezni, hogy történt-e árváltozás.
    Ha történt, akkor a periódus első napja előtti max(datum)hoz tartozó beszer.árral kell számoljak

    Miért kell foglalkoznod
    max(datum)
    -mal, ha egyszer minden rekordban ott az aktuális beszerzési ár (2.pont)?
    Mutasd a teljes hozzászólást!
  • Hát, lehet, hogy nem voltam világos, de akkor megpróbálom egy példán keresztül levezetni.
    Adott egy termék, aminek októbertől decemberig történő fogyására vagyok kíváncsi.
    Lekérdezem azt, hogy a vizsgált időszakban mennyi volt a fogyás, mondjuk 100 db.
    DE november elsején volt egy árváltozás, amit figyelembe kell vegyek. Tehát meg kell határoznom, hogy október elsején mennyi volt a termék beszerzési ára (
    Miért kell foglalkoznod max(datum)-mal, ha egyszer minden rekordban ott az aktuális beszerzési ár (2.pont)?
    ), mert a termék táblában nem a beszerzési ár, hanem a fogyasztási ár szerepel. Ezután megnézem, hogy mennyi fogyott okt. 1-je és nov. 1-je között, mondjuk 50 db, majd megnézem, hogy az árváltozás után mennyi lett a beszerzési ár, és azzal is számolok.
    Az a kérdésem, hogyan oldható meg ez egy lekérdezésben, mert amit szeretnék, az az, hogy a vizsgált időszakban a termék kétszer szerepeljen, egyszer a régi beszerárral 50 db, majd egyszer az új beszerárral szintén 50 db.
    Mutasd a teljes hozzászólást!
  • Szia!

    Szerintem csinálj egy temporális táblát és a két lekérdezés eredményét abba írd bele. Ha további feldolgozás szükséges, akkor azt is megteheted, ha a két eredményt külön akarod mutatni,azt is megteheted.

    (Felhívom azonban egy apróságra a figyelmedet, mivel én is áruforgalmi rendszerek témájában matatok:
    Mi történik akkor, ha adott napon reggel 9-kor történik értékesítés, 13:00-kor érkezik más áron szállítmány, majd 19:00 -kor ismét értékesítesz, már az árváltozás után??? )
    Mutasd a teljes hozzászólást!
  • Szia!

    Én nem látok olyan nagy gondot a te általad felvetett problémában, mert a bizonylatokhoz megvan a pontos dátum és időpont is, így aszerint is tudnék szűrni. Csak mivel sql-ben nem vagyok igazán otthon, ezért gondoltam, hogy hátha megoldható ez - általam deklarált - ideiglenes táblák nélkül is.
    Mutasd a teljes hozzászólást!
  • A kérdése arra vonatkozott, ha van 2 db 1000 Ft-os beszerzési áru termék, és ebből reggel eladsz egyet, majd egy óra múlva jön 500-ért a termék, és utána eladsz egyet, akkor most melyikből is adtál el?
    Mutasd a teljes hozzászólást!
  • Jogos a kérdés, de szerintem a FIFO módszer szerint csinálom. De a problémám igazából, hogy hogyan kell megírni egy ilyen lekérdezést, ami a beszerárakat egyáltalán kimutatja az adott időszak vonatkozásában.
    Mutasd a teljes hozzászólást!
  • lehet nem jol ertem, de

    select beszerzesi_ar from termekmozgastabla
    where datum between '2008-01-01' and '2008-02-01'
    and termek_id = 12
    group by beszerzesi_ar

    ezzel az adott idoszakra visszakapod a beszerzesi arakat amik kulonboztek.
    nem erre lenne szükséged?

    and termek_id = 12, gondolom a "termekmozgastabla" - ban is kell lennie vmi azonositonak, ami beazonositja, hogy melyik termekrol van szo, en az adataidban ezt nem ismertem fel, ezert talaltam ezt ki.
    Mutasd a teljes hozzászólást!
  • Egy ilyen:

    SELECT Tábla1_1.id, Max(Tábla1.id) AS MaxOfid FROM Tábla1 INNER JOIN Tábla1 AS Tábla1_1 ON (Tábla1.dátum < Tábla1_1.dátum) AND (Tábla1.progID = Tábla1_1.progID) WHERE (((Tábla1.mozgas)=1) AND ((Tábla1_1.mozgas)=2)) GROUP BY Tábla1_1.id
    Megmondja, hogy melyik eladás melyik beszerzéshez kapcsolódik.

    mozgás=1 : beszerzés
    mozgás=2 : eladás
    Nincs azonos dátum, mert adátum mezőben pontos idő is van (egy napon belül több beérkezés), de persze lehet = is.

    És ezt a lekérdezést használod egy másikban:
    SELECT Tábla1.*, Tábla1_1.ár, Tábla1_1.dátum, Tábla1.dátum FROM ( SELECT Tábla1_1.id, Max(Tábla1.id) AS MaxOfid FROM Tábla1 INNER JOIN Tábla1 AS Tábla1_1 ON (Tábla1.dátum < Tábla1_1.dátum) AND (Tábla1.progID = Tábla1_1.progID) WHERE (((Tábla1.mozgas)=1) AND ((Tábla1_1.mozgas)=2)) GROUP BY Tábla1_1.id ) áraz1 INNER JOIN Tábla1 ON áraz1.id = Tábla1.id) INNER JOIN Tábla1 AS Tábla1_1 ON áraz1.MaxOfid = Tábla1_1.id WHERE (((Tábla1.dátum)>[Tábla1_1].[dátum]));
    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