Я получал остатки на дату таким вот запросом:
Код:
SELECT c.article as "Артикул",
c.name as "Наименование",
NVL(q.quantity,0)-NVL(pr.quantity,0)+NVL(rs.quantity,0) as "Остаток"
FROM supermag.smcard c,
supermag.smgoods q,
(
SELECT dc.article,
SUM(dc.quantity) as quantity
FROM supermag.smdocuments d,
supermag.smspec dc
WHERE d.doctype=dc.doctype
AND d.id=dc.docid
AND d.docstate>=2
AND TO_DATE(d.createdat) >= ('03.07.2007')
AND d.locationto = (4)
GROUP BY dc.article
) pr,
(
SELECT dc.article,
SUM(dc.quantity) as quantity
FROM supermag.smdocuments d,
supermag.smspec dc
WHERE d.doctype=dc.doctype
AND d.id=dc.docid
AND d.docstate>=2
AND TO_DATE(d.createdat) >= ('03.07.2007')
AND d.locationfrom = (4)
GROUP BY dc.article
) rs
WHERE c.article=pr.article(+)
AND c.article=rs.article(+)
AND c.article=q.article(+)
AND q.storeloc=(4)
Обрати внимание, что в запросе в двух местах нужно подставить нужную дату и в трех местах код места хранения.
В моей базе запрос выполнился за 1,52 секунды.