Помогите, пожалуйста, с запросом. Следующий - считает остатки по документам на конкретную дату и выводит их количество.
Код:
SELECT
SACARDCLASS.TREE,
SACARDCLASS.NAME,
SMCARD.NAME,
SMSPEC_ARTICLE,
SMSPEC_QUANT,
--NVL(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) LOCATION,
to_date('09.04.2007', 'DD.MM.YYYY') DATE_G
FROM
(
SELECT SMSPEC_ARTICLE, SUM(QUANT) SMSPEC_QUANT FROM(
SELECT
SMSPEC.ARTICLE SMSPEC_ARTICLE,
SUM(DECODE(SMSPEC.DOCTYPE, 'IW', -SMSPEC.QUANTITY)) QUANT
FROM
SMSPEC,
SMDOCUMENTS,
SMCARD
WHERE
SMSPEC.doctype = SMDOCUMENTS.doctype
AND SMSPEC.docid = SMDOCUMENTS.id
AND SMSPEC.article = SMCARD.article
AND nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(6)
AND SMCARD.ACCEPTED=1
AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')
AND SMDOCUMENTS.docstate >= 2
AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')
Group by SMSPEC.ARTICLE
UNION ALL
SELECT SMSPEC.ARTICLE SMSPEC_ARTICLE,
SUM(DECODE(SMSPEC.DOCTYPE, 'IW', SMSPEC.QUANTITY)) QUANT
FROM
SMSPEC,
SMDOCUMENTS,
SMCARD
WHERE
SMSPEC.doctype = SMDOCUMENTS.doctype
AND SMSPEC.docid = SMDOCUMENTS.id
AND SMSPEC.article = SMCARD.article
AND nvl(SMDOCUMENTS.locationto, SMDOCUMENTS.locationfrom) IN(6)
AND SMCARD.ACCEPTED=1
AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')
AND SMDOCUMENTS.docstate >= 2
AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')
Group by SMSPEC.ARTICLE
UNION ALL
SELECT SMSPEC.ARTICLE SMSPEC_ARTICLE,
SUM(DECODE(SMSPEC.DOCTYPE,
'WI', SMSPEC.QUANTITY,
'WO', -SMSPEC.QUANTITY,
'CR', SMSPEC.QUANTITY,
'CS', -SMSPEC.QUANTITY,
'OR', SMSPEC.QUANTITY,
'IL', SMSPEC.QUANTITY
)) QUANT
FROM
SMSPEC,
SMDOCUMENTS,
SMCARD
WHERE
SMSPEC.doctype = SMDOCUMENTS.doctype
AND SMSPEC.docid = SMDOCUMENTS.id
AND SMSPEC.article = SMCARD.article
AND nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(6)
AND SMCARD.ACCEPTED=1
AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')
AND SMDOCUMENTS.docstate >= 2
AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')
Group by SMSPEC.ARTICLE
)
Group by SMSPEC_ARTICLE
),
SACARDCLASS,
SMSPEC,
SMDOCUMENTS,
SMCARD
WHERE
SACARDCLASS.ID = SMCARD.IDCLASS
AND SMSPEC_ARTICLE = SMSPEC.ARTICLE
AND SMSPEC.doctype = SMDOCUMENTS.doctype
AND SMSPEC.docid = SMDOCUMENTS.id
AND SMSPEC.article = SMCARD.article
--AND nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(6)
AND SMCARD.ACCEPTED=1
AND SMDOCUMENTS.createdat <= to_date('09.04.2007', 'DD.MM.YYYY')
AND SMDOCUMENTS.docstate >= 2
AND SMDOCUMENTS.doctype IN('WI', 'WO', 'CS', 'CR', 'IW', 'OR', 'IL')
Group BY SACARDCLASS.TREE, SACARDCLASS.NAME, SMCARD.NAME, SMSPEC_ARTICLE, SMSPEC_QUANT
ORDER BY SACARDCLASS.TREE
Отрабатывает нормально. Но...
Нужно отображать также информацию о том, где находится данный товар. Для тех случаев, например, когда производится выборка из нескольких мест хранения. Просто добавить эти данные я не могу (закомментированная строчка) потому, что товар может быть списан на склад брака, а также возвращен оттуда, следовательно должны быть учтены движения:
1. NVL(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto)
2. NVL(SMDOCUMENTS.locationto, SMDOCUMENTS.locationfrom)
где для некоторых перемещений locationfrom может быть местом хранения, а также может быть местом хранения locationto (для тех случаев когда товар идет на скалад брака)
С этой целью был организован подзапрос, возвращающий нужное количество остатков. Он возвращает правильные значения, но есть еще и внешний запрос, который то и покажет данные в необходимой форме.
Вопрос: а как, не ограничивая полученных в подзапросе данных, отобразить эти места хранения для каждого из полученных значений?
Ведь если просто вывести, например NVL(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) (закоментированное в шапке запроса) и наложить условие:
nvl(SMDOCUMENTS.locationfrom, SMDOCUMENTS.locationto) IN(2) результат внутреннего запроса будет ограничен данными только для одного типа перемещений и, следовательно отобразятся не все остатки.