18.05.2007 17:11
Vlad
 
select os_n.kol,
os_k.kol,
pr.kol,
os_n.article,
-- os_k.article,
os_n.shortname,
gc.idclass,
gr.tree,
gr.name
from
(select nvl(sum(quant),0) kol,
article,
shortname
from(
select sum(decode(t.doctype,'WI',t.quantity,'WO',-t.quantity,'CR',t.quantity,'CS',-t.quantity,'PD',t.quantity,'PE',-t.quantity)) quant,
t.article article,
nvl(d.locationto, d.locationfrom) loc,
c.shortname,
l.name mag
from smspec t, smdocuments d, smcard c, smstorelocations l
where t.doctype = d.doctype
and t.docid = d.id
and d.createdat < '01.01.2007'
and d.docstate > 2
and d.doctype in ('WI', 'WO', 'CS', 'CR', 'PE', 'PD')
and nvl(d.locationto, d.locationfrom) in (select id from smstorelocations where idclass=2 and id=2)
and l.id=nvl(d.locationto, d.locationfrom)
and t.article in (select article from smcard where idclass in (728))
and c.article=t.article
group by l.name, t.article, c.shortname, nvl(d.locationto, d.locationfrom))
group by article, shortname) os_n,
(select nvl(sum(quant),0) kol,
article,
shortname
from(
select sum(decode(t.doctype,'WI',t.quantity,'WO',-t.quantity,'CR',t.quantity,'CS',-t.quantity,'PD',t.quantity,'PE',-t.quantity)) quant,
t.article article,
nvl(d.locationto, d.locationfrom) loc,
c.shortname,
l.name mag
from smspec t, smdocuments d, smcard c, smstorelocations l
where t.doctype = d.doctype
and t.docid = d.id
and d.createdat < '01.02.2007'
and d.docstate > 2
and d.doctype in ('WI', 'WO', 'CS', 'CR', 'PE', 'PD')
and nvl(d.locationto, d.locationfrom) in (select id from smstorelocations where idclass=2 and id=2)
and l.id=nvl(d.locationto, d.locationfrom)
and t.article in (select article from smcard where idclass in (728))
and c.article=t.article
group by l.name, t.article, c.shortname, nvl(d.locationto, d.locationfrom))
group by article, shortname) os_k,
(select nvl(sum(quant),0) kol,
article,
shortname
from(
select sum(decode(t.doctype,'CS', t.quantity, 'CR', -t.quantity)) quant,
t.article article,
nvl(d.locationto, d.locationfrom) loc,
c.shortname,
l.name mag
from smspec t, smdocuments d, smcard c, smstorelocations l
where t.doctype = d.doctype
and t.docid = d.id
and d.createdat > '01.01.2007'
and d.createdat< '01.02.2007'
and d.docstate > 2
and d.doctype in ('CS', 'CR')
and nvl(d.locationto, d.locationfrom) in (select id from smstorelocations where idclass=2 and id=2)
and l.id=nvl(d.locationto, d.locationfrom)
and t.article in (select article from smcard where idclass in (728))
and c.article=t.article
group by l.name, t.article, c.shortname, nvl(d.locationto, d.locationfrom))
group by article, shortname) pr,
smcard gc,
sacardclass gr
where os_n.article=os_k.article
and gc.article=os_n.article
and gr.id=gc.idclass
-- and os_n.article=pr.article
Предполагается что запрос должен брать остатки на начало, на конец пеиода и продажи по кассам за период. Все данные запрос выбирает правильно, но если за период продался только один товар, а остатки по нескольким товарам то в поле pr.kol для всех товаров проставляется продажа только того артикула, который продавался за период.
При включенном and os_n.article=pr.article выбирается только одна строчка.
Использовал за основу отчет Mirt.
18.05.2007 17:21
Mtirt
 
Тут не соединение один к одному, насколько я понимаю.
Обычно в таких случаях я использую для объединения таких запросов внешнее объединение.
Попробуй например так:
Код:
 where gs.article=os_k.article(+)
      and gc.article=os_n.article(+)
	  and gr.id=gc.idclass
and gs.article=pr.article(+)
Если не поможет, то конструкция union all
18.05.2007 18:33
Vlad
 
Спасибо, помогло, а что означают (+)?
18.05.2007 18:38
OlegON
 
Цитата:
Vlad Спасибо, помогло, а что означают (+)?

RIGHT JOIN
19.05.2007 00:14
mighty
 
Цитата:
Vlad Предполагается что запрос должен брать остатки на начало, на конец пеиода и продажи по кассам за период.
Vlad позволь спросить, а сколько у тебя исполняется этот запрос по времени?

Просто я тут тож вчера писал отчет для товароведов в максимизатор по продажам и остаткам товаров. Запустил твой один из подзапросов, просто выдрал из этого большого запроса - он у меня 57 секунд катается.
Может мой попробуй если тебя устроит - он у меня за 6 секунд отрабатывает. Вродь тоже самое выдает:

select c.article "Артикул", replace(c.name, chr(9),' ') "Наименование", c.mesabbrev "Ед. изм.",
nvl(g.quantity,0)+nvl(quantity_goods,0)-(nvl(io.quantity_in,0)+nvl(io.quantity_out,0)) "Остатки на начало",
nvl(io.quantity_in,0) "Количество. Приход (приход+возвраты покупателей)",
0-nvl(io.quantity_out,0) "Количество. Расход (Продажи+Возвраты постащикам)",
ROUND(0-decode(nvl(io.quantity_out,0),0,0,io.quantity_out/(to_date('01.03.2007','DD.MM.YYYY')-to_date('01.01.2007','DD.MM.YYYY'))),1)
"Среднесуточная реализация по всем дням периода",
nvl(g.quantity,0)+nvl(quantity_goods,0) "Остатки на конец"
from
(
select
s.article,
sum(nvl2(d.locationto,s.quantity,0)) quantity_in,
sum(nvl2(d.locationfrom,-s.quantity,0)) quantity_out
from supermag.smdocuments d, supermag.smspec s
where d.docstate=3
and d.createdat>=to_date('01.01.2007','DD.MM.YYYY')
and d.createdat<=to_date('01.03.2007','DD.MM.YYYY')
and d.locationto||d.locationfrom=2
and s.doctype=d.doctype
and s.docid=d.id
group by s.article
) IO,
(
select
s.article,
sum(nvl2(d.locationto,s.quantity,-s.quantity)) quantity_goods
from supermag.smdocuments d, supermag.smspec s
where d.docstate=3
and d.createdat>to_date('01.03.2007','DD.MM.YYYY')
and d.locationto||d.locationfrom=2
and s.doctype=d.doctype
and s.docid=d.id
group by s.article
) GD,
(
select * from supermag.smgoods fg where fg.storeloc=2
) G,
supermag.smcard C
where
io.article(+)=c.article
and gd.article(+)=c.article
and g.article(+)=c.article
and c.accepted=1
and upper(c.name) like '%ПИВО%'

-----
Начало периода 01.01.2007
Конец периода 01.03.2007
Место Хранения с id=2
Всё "пиво"
Только активные карточки.

Правда я тут схитрил и запрос делаю не от начала работы супермага, а наоборот от текущих остатков. Не знаю правильно ли это с точки зрения функционала СМ (то есть верные ли всегда текущие остатки в таблице SMGOODS), но работает очень быстро..Проверял, вродь все верно..
19.05.2007 16:55
Vlad
 
mighty спасибо за запрос, время будет обязательно попробую. Проблемма в том что я sql практически незнаю, вот потихоньку разбираюсь.
А так мой запрос отрабатывается гдето 4 мин.
20.05.2007 09:12
Mtirt
 
mighty, компания С+ считает остатки на дату так же как ты.
22.05.2007 03:03
isi
 
Цитата:
Mtirt mighty, компания С+ считает остатки на дату так же как ты.
Разве? Попробуйте оттрасировать "Разделы"->"Остатки" на дату, там подсчет идет не от текущих, а именно за весь период... СМ 1.024.5 SP5. Хотя я в зависимости от нужд применяю и тот и тот подход...
22.05.2007 06:54
Mtirt
 
Зато в отчете "Остатки", расчет идет именно от текущих остатков. Трассировали как раз.
22.05.2007 15:09
mighty
 
Цитата:
Mtirt Зато в отчете "Остатки", расчет идет именно от текущих остатков. Трассировали как раз.
Mtirt, подскажи плз как вы трассируете запросы от СМ?
Часовой пояс GMT +3, время: 18:44.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.