Új hozzászólás Aktív témák

  • martonx
    veterán

    Sziasztok, picit megrekedtem az SQL tudásommal :) Volna 2 tábla, egyikben termékek vannak, vonalkód és áruház és az ára. A másik egy LOG, ha változik egy vonalkód ára az adott áruházban akkor mentődik.

    Az lenne a lekérdezés lényege, hogy listázzam az összes terméket az első táblából, és ha van hozzá tartozó log, akkor azt is, de abból is csak a legutolsót az adott áruház-vonalkód alapján.

    Itt lenne a minta amit tovább kellene vinnem:

    https://www.db-fiddle.com/f/unix3VPHaQTSD3GCjf58zA/3

    És az lenne a cél, hogy ezt kapjam vissza, ugyebár minden áruház csak egyszer szerepeljen és csak a legutolsó log adatai legyenek mellette, amihez pedig nincs log, ott NULL-t adjon vissza:

    vonalkod | aruhaz | ar | valtozas_datum | regiar
    59900444 | Budapest | 33000 | 2017-10-03 12:00 | 87000
    59900444 | Szeged | 44000 | 2017-10-05 10:00 | 660000
    59900444 | Pécs | 55000 | NULL | NULL

    A gondom az, hogy ha leszűröm azzal, hogy GROUP BY termek.aruhaz akkor ugyan visszakapom nagyjából azt amit szeretnék, de a Budapesti áruházból nem a legutolsó logot.

    SELECT termek.vonalkod,termek.aruhaz,termek.ar, arvaltozas_log.valtozas_datum,arvaltozas_log.regiar
    FROM termek LEFT JOIN arvaltozas_log
    ON termek.vonalkod=arvaltozas_log.vonalkod
    AND termek.aruhaz=arvaltozas_log.aruhaz GROUP BY termek.aruhaz;

    Tovább szűröm így MAX(arvaltozas_log.valtozas_datum) akkor már a legutolsó dátumot kapom vissza, de nem az ahhoz tartozó "régi árat" teszi hozzá .... :W

    SELECT termek.vonalkod,termek.aruhaz,termek.ar, MAX(arvaltozas_log.valtozas_datum),arvaltozas_log.regiar
    FROM termek LEFT JOIN arvaltozas_log
    ON termek.vonalkod=arvaltozas_log.vonalkod
    AND termek.aruhaz=arvaltozas_log.aruhaz GROUP BY termek.aruhaz;

    Köszönöm ha valaki tudna segíteni. :R

    select t.vonalkod, t.aruhaz, t.ar, log.valtozas_datum, log.regiar
    from termek t
    left join (
    select al.*
    from arvaltozas_log al
    join (
    select aruhaz, Max(valtozas_datum) latest_valtozas
    from arvaltozas_log
    group by aruhaz) latest on al.valtozas_datum = latest.latest_valtozas and al.aruhaz = latest.aruhaz
    ) log on t.vonalkod = log.vonalkod
    and t.aruhaz = log.aruhaz

    Pár megjegyzés:
    1. végre valaki, aki vette a fáradtságot normális példa készítésére :)
    2. a logodban ez a változás dátumra maxolás elég szerencsétlen, kellene bele egy autoincrement int ID
    3. nevezéktana borzalmas az adatbázisodnak

Új hozzászólás Aktív témák