Ok, this gets you MOST of the way there. Couple of things though:
Anyway, here's my answer:
WITH Dates AS (
SELECT ValidFrom, ProductCode
FROM ListPrice
UNION
SELECT ValidTo, ProductCode
FROM ListPrice
UNION
SELECT ValidFrom, ProductCode
FROM Discounts
UNION
SELECT ValidTo, ProductCode
FROM Discounts),
DateRanges AS (
SELECT ValidFrom, LEAD(ValidFrom) OVER (PARTITION BY ProductCode ORDER BY ValidFrom) AS ValidTo,
ProductCode
FROM Dates)
SELECT DR.ProductCode, DR.ValidFrom, DR.ValidTo,
LP.ListPrice,
D.Discount1, D.Discount2,
LP.ListPrice * (1 - D.Discount1) * (1 - D.Discount2) AS FinalPrice
FROM DateRanges DR
JOIN Discounts D ON DR.ProductCode = D.ProductCode
AND DR.ValidFrom BETWEEN D.ValidFrom AND D.ValidTo
AND DR.ValidTo BETWEEN D.ValidFrom AND D.ValidTo
LEFT JOIN ListPrice LP ON D.ProductCode = LP.ProductCode
AND DR.ValidFrom BETWEEN LP.ValidFrom AND LP.ValidTo
AND DR.ValidTo BETWEEN LP.ValidFrom AND LP.ValidTo
WHERE DR.ValidTo IS NOT NULL
ORDER BY DR.ProductCode, DR.ValidFrom;
If you don't understand any of it, please reply and ask.
Thom~
Excuse my typos and sometimes awful grammar. My fingers work faster than my brain does.
Larnu.uk