Beosztás lekérdezése historyval

Beosztás lekérdezése historyval
2011-10-15T15:07:40+02:00
2011-10-26T00:00:38+02:00
2022-11-23T11:35:39+01:00
Whpgab
Sziasztok,

A következő problémát szeretném megoldani T-sql 2005 alatt: az egyik táblában(napiember) a dolgozok beosztását tárolom. Tartalmazza a dolgozó számát(dszam) és a munkakezdését(tdatumkezd) és végzését(tdatumvegez) és egyéb adatokat.
A másik tábla(napiember_hist) tartalmazza, hogy egy adott napon milyen változások történtek. Itt is van egy dolgozó szám(dszam) és egy kezdési(datumkezd) és végzési idő(datumvegez) pluszban még, hogy mikor(rogzitido) és ki módosította( modositotta).

Szeretnék egy olyan lekérdezést készíteni, ami mondjuk egy hónapot kér le a napiember táblából és minden egyes naphoz hozzácsatolja hogy ki és mikor módosította utoljára.
A két táblában a dátumok megegyeznek, de a dátum mellett lévő idő már eltérő.
Ha lehet, egy példa sql parancsot szeretnék kérni.
A napiember táblából szükségem van minden oszlopra, nem csak az itt megnevezettekre.

Előre is köszönöm a segítséget.
Mutasd a teljes hozzászólást!
Közben sikerült megoldani máshogy.
Készítettem egy view:

SELECT DISTINCT dszam, YEAR(datumkezd) AS ev, MONTH(datumkezd) AS ho, DAY(datumkezd) AS nap, rogzitido, modositotta FROM dbo.napiember_hist AS nh1 WHERE (rogzitido >= ALL (SELECT rogzitido FROM dbo.napiember_hist AS nh3 WHERE (nh1.dszam = dszam) AND (YEAR(nh1.datumkezd) = YEAR(datumkezd)) AND (MONTH(nh1.datumkezd) = MONTH(datumkezd)) AND (DAY(nh1.datumkezd) = DAY(datumkezd))))

Majd egy lekérdezést:

SELECT n.*,nhc.modositotta,nhc.rogzitido FROM napiember n LEFT JOIN napihist_last_change nhc ON (n.dszam=nhc.dszam AND YEAR(n.tdatumkezd)=nhc.ev AND MONTH(n.tdatumkezd)=nhc.ho AND DAY(n.tdatumkezd)=nhc.nap) WHERE tdatumkezd > '20110501' AND tdatumkezd <= '20110601' and n.dszam = '9290' ORDER BY tdatumkezd
Mutasd a teljes hozzászólást!

  • Bocsi, de hol akadtál el?
    Management Studio 2005 lekérdezés szerkesztőjét nem használod?
    Behúzod a két táblát, összekötöd a közös kulccsal, kiemeled a megjeleníteni kívánt oszlopokat, a feltételekhez rögzíted az adott intervallumot (between segítségével), oszt szépnapot.
    Mutasd a teljes hozzászólást!
  • Azért nem ilyen egyszerű, különben már kész lenne. A közös kulcs a dszam és a tdatumkezd és datumkezd. De mivel a tdatumkezd óra része nem egyezik meg a datumkezd óra részével, így direktbe nem lehet összekötni, csak a dátum részüket. Az a lekérdezés, ami a hónapot kérdezi le megvan. Ami kell, az ami a historyból az adott naphoz tartozó adatokat kiválasztja, majd a legkésőbbit rendeli össze vele.
    Mutasd a teljes hozzászólást!
  • No, már sokféle infót megosztottál, de kimaradt a táblák specifikálása.
    Légy szíves, vésd ide a két tábla struktúráját (táblanév, oszlop nevek + típusok, elsődleges/idegen kulcs, stb.), s jelezd mely oszlopokat szeretnéd látni.
    Mutasd a teljes hozzászólást!
  • Az első tábla, napiember:

    szam int (elsődleges kulcs)
    dszam nvarchar(5)
    tdatumkezd datetime
    tdatumvege datetime
    ...

    A napiember táblából az össze oszlopot szeretném látni. Még van egy pár adat a fentieken kívül.
    A napiember_hist táblából a modositotta és a rogzitido kellene.

    A másik tábla, napiember_hist:

    szam int (elsődleges kulcs)
    dszam nvarchar(5)
    datumkezd datetime
    datumvege datetime
    modositotta nvarchar(10)
    rogzitido datetime


    Ami megegyezik egy nap esetén az a dszam és a tdatumkezd és datumkezd dátum része (pl.: tdatumkezd = 20111001 10:30 és datumkezd 20111001 12:00 a dátum megegyezik)

    Ez az eredeti lekérdezés(ez egy hónap adatot kér le):
    Select * FROM napiember N left join d_szabadsag_igeny I on (N.szam = I.napiember_szam)
    WHERE n.dszam = '3803' AND Year([tdatumkezd])=2011 AND Month([tdatumkezd])= 9 ORDER BY Day(tdatumkezd) asc;

    Köszi.



    Mutasd a teljes hozzászólást!
  • Ami megegyezik egy nap esetén az a dszam és a tdatumkezd és datumkezd dátum része (pl.: tdatumkezd = 20111001 10:30 és datumkezd 20111001 12:00 a dátum megegyezik)

    Ez megoldható, ha használod pl. a Convert() függvényt.
    (left join helyett inkább inner join, mert minek az üres oszlop?)
    Tehát a kapcsolat dátum része:
    CONVERT(nchar(10), tdatumkezd, 102) = CONVERT(nchar(10), datumkezd, 102)

    Egyébként a megoldás egyszerű lehet, ha paraméteres tárolt eljárást használsz. A paraméter jelen esetben az adott dátum, ezt átadod egy függvénynek, ami előállítja néked az adott sort:

    Ami kell, az ami a historyból az adott naphoz tartozó adatokat kiválasztja, majd a legkésőbbit rendeli össze vele.

    Ugye itt egy sima select dátumra rendezve csökkenőben, az első kiválasztása (Top(1).
    No, és e függvénnyel kötöd össze az első táblád.
    Mutasd a teljes hozzászólást!
  • Közben sikerült megoldani máshogy.
    Készítettem egy view:

    SELECT DISTINCT dszam, YEAR(datumkezd) AS ev, MONTH(datumkezd) AS ho, DAY(datumkezd) AS nap, rogzitido, modositotta FROM dbo.napiember_hist AS nh1 WHERE (rogzitido >= ALL (SELECT rogzitido FROM dbo.napiember_hist AS nh3 WHERE (nh1.dszam = dszam) AND (YEAR(nh1.datumkezd) = YEAR(datumkezd)) AND (MONTH(nh1.datumkezd) = MONTH(datumkezd)) AND (DAY(nh1.datumkezd) = DAY(datumkezd))))

    Majd egy lekérdezést:

    SELECT n.*,nhc.modositotta,nhc.rogzitido FROM napiember n LEFT JOIN napihist_last_change nhc ON (n.dszam=nhc.dszam AND YEAR(n.tdatumkezd)=nhc.ev AND MONTH(n.tdatumkezd)=nhc.ho AND DAY(n.tdatumkezd)=nhc.nap) WHERE tdatumkezd > '20110501' AND tdatumkezd <= '20110601' and n.dszam = '9290' ORDER BY tdatumkezd
    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