Sziasztok!
A következő feladathoz keresek valami megoldást SQL parancsokkal (MS SQL server 2003 + Crystal Report). 2-3 lekérdezéssel Crystal Reportban valahogy össze tudom "berhelni", de ha jól sejtem ezt egyedi SQL függvényekkel is meg lehet oldani valahogy, de ezen a téren még nincs tapasztalatom.
Szóval adott két tábla az egyik a raktármozgásokat tartalmazza, a másik a termékek árait az egyes időszakokban. Hogyan tudom a beérkezés napján érvényes árakkal kilistázni a termékeket?
1. tábla:
cikkszám
dátum
db
2. tábla
cikkszám
ár
érvényesség kezdete (értelemszerűen az ár a következő dátumig/rekordig/ érvényes)
Előre is kösz!
- 1757 megtekintés
Hozzászólások
Ha a 2. tábla tartalmazna egy "érvényesség vége" oszlopot, akkor könnyebb lenne. Nem lehet kiegészíteni?
- A hozzászóláshoz be kell jelentkezni
Sajna nem, egy nagy ERP rendszerben van.
- A hozzászóláshoz be kell jelentkezni
az érvényesség megállapítása így nem segít?
select top 1 * from price order by validity desc where validity < itemvalidity
- A hozzászóláshoz be kell jelentkezni
Először is kell egy leválogatás, hogy meglegyen az érvényesség vége:
select * from (
select x1.*, x2.erv-(1./(24*60*60*100)) ervv,
ROW_NUMBER() OVER ( partition by x1.cikk,x1.erv ORDER BY x1.erv, x2.erv ) AS rank
from t2 x1
left outer join t2 x2 on x1.cikk=x2.cikk and x2.erv>x1.erv
) x3 where rank=1
Ezt kell beépíteni egy inner joinnal a darabszámos lekérdezésbe:
select t1.*, x4.ar from T1
inner join (
select * from (
select x1.*, x2.erv-(1./(24*60*60*100)) ervv,
ROW_NUMBER() OVER ( partition by x1.cikk,x1.erv ORDER BY x1.erv, x2.erv ) AS rank
from T2 x1
left outer join t2 x2 on x1.cikk=x2.cikk and x2.erv>x1.erv
) x3 where rank=1
) x4 on t1.cikk=x4.cikk and
(t1.dat between x4.erv and x4.ervv
or
t1.dat >= x4.erv and x4.ervv is null)
Táblák:
CREATE TABLE [dbo].[T1](
[cikk] [int] NOT NULL,
[dat] [datetime] NOT NULL,
[db] [int] NOT NULL
)
go
CREATE TABLE [dbo].[T2](
[cikk] [int] NOT NULL,
[ar] [int] NOT NULL,
[erv] [datetime] NOT NULL
)
go
- A hozzászóláshoz be kell jelentkezni
SELECT
*,
(
SELECT
Ar
FROM
Arak
WHERE
Arak.Cikkszam = Raktar.Cikkszam
AND ErvKezd =
(SELECT MAX(ErvKezd) FROM Arak WHERE Arak.CikkSzam = Raktar.Cikkszam AND ErvKezd < Datum)
)
FROM
Raktar
Ja, SQL Server 2003, olyan nincs.
Bár egyszer interjún próbált meggyőzni a jelölt, hogy ő azt üzemeltetett. Nem vettük föl. :)
--
geri / otperc.net
- A hozzászóláshoz be kell jelentkezni
Jogos :)
Win2003 Server volt a szemem előtt, az adatbázis MS SQL 2000
- A hozzászóláshoz be kell jelentkezni
Köszönöm a sok segítséget! Sikerült, és egyszerűbben, mint vártam :)
Valami ilyesmi lett:
SELECT
raktár.cikk,
árak.ár
FROM
raktár, árak
WHERE
raktár.cikk = árak.cikk AND
árak.érvényes =
(SELECT MAX(árak.érvényes)
FROM árak
WHERE árak.cikk = raktár.cikk AND
árak.érvényes <= raktár.érkezett);
- A hozzászóláshoz be kell jelentkezni