[Megoldva] SQL: időszeletes táblák összekapcsolása

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!

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?

az érvényesség megállapítása így nem segít?

select top 1 * from price order by validity desc where validity < itemvalidity

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

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

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);