01.03.2012 08:34
CrazyWolf
 
День добрый. У доблестной бухгалтерии зачесалось в одном месте и захотели они увидеть следующее:
нужно получить для указанного артикула остатки на указанную дату и реализацию за нее же. Навскидку накидал
Код:
select s.article,
coalesce(max(g.quantity), 0) - 
coalesce(sum(CASE WHEN d.doctype = 'CR' or d.doctype = 'WI' or (d.doctype = 'IW' and d.locationto = 7) 
                               then s.quantity 
                               else s.quantity * (-1) end),0) as goodstodate,
sum(CASE WHEN d.createdat = to_date('25.01.2012', 'DD.MM.YYYY') and d.doctype = 'CS' 
         then s.quantity 
         else CASE WHEN d.createdat = to_date('25.01.2012', 'DD.MM.YYYY') and d.doctype = 'CR'
           then s.quantity * (-1)
           else 0 end end) as prodagi
from smdocuments d, smspec s
left outer join smgoods g on (s.article = g.article and g.storeloc = 7)
where d.id = s.docid and d.doctype = s.doctype
and d.doctype in ('CR', 'CS', 'WI', 'WO', 'IW')
and s.article = '0017590' and d.docstate = 3 
and (d.locationto = 7 or d.locationfrom = 7 )
and d.createdat between to_date('25.01.2012', 'DD.MM.YYYY') and trunc(current_date)
group by s.article
Можно ли это сделать покрасивее?
01.03.2012 08:41
Mtirt
 
А по форуму поискать не пробовал?
Тут штук 5 вариантов рабочих валяется?

И чем вашу бухгалтерию Бизнес-Анализ не устраивает?
Там всё есть.
01.03.2012 08:43
CrazyWolf
 
Цитата:
Mtirt А по форуму поискать не пробовал?
Тут штук 5 вариантов рабочих валяется?

И чем вашу бухгалтерию Бизнес-Анализ не устраивает?
Там всё есть.
:) нашел пример, с унионами, попробую посмотреть что быстрее будет.
Насчет не устраивает - не знаю почему :) вот такие они у нас странные :)
01.03.2012 11:44
CrazyWolf
 
Для конкретного артикула самый низкий план дает
Код:
select s.article,
coalesce(max(g.quantity), 0) - 
coalesce(sum(nvl2(d.locationto,s.quantity,-s.quantity)),0) as goodstodate,
sum(CASE WHEN d.doctype = 'CS' then s.quantity else CASE WHEN d.doctype = 'CR' then s.quantity * (-1) else 0 end end) keep (dense_rank first order by d.createdat) as prodagi
from smdocuments d, smspec s
left outer join smgoods g on (s.article = g.article and g.storeloc = 7)
where d.id = s.docid and d.doctype = s.doctype
and d.doctype in ('CR', 'CS', 'WI', 'WO', 'IW')
and s.article = '0017590' and d.docstate = 3 
and (d.locationto || d.locationfrom = 7 )
and d.createdat between to_date('25.01.2012', 'DD.MM.YYYY') and trunc(current_date)
group by s.article
Еще вопрос возник, впервые в теме https://olegon.ru/showthread.php?t=2...hlight=�������+�������� столкнулся с конструкцией
Код:
d.locationto||d.locationfrom=2
Это следует понимать как Оракловый синтаксис для
Код:
d.locationto=2 or d.locationfrom=2
01.03.2012 17:59
vdm
 
Цитата:
CrazyWolf
Код:
d.locationto||d.locationfrom=2
Это следует понимать как Оракловый синтаксис для
Код:
d.locationto=2 or d.locationfrom=2
Это неявное преобразование в char, из-за символьной функции ||
Т.е. аналог
Код:
to_char(d.locationto) || to_char(d.locationfrom) = '2'
01.03.2012 18:33
OlegON
 
Не очень понял, что хотел сказать vdm, но показалось, что он ошибся. В отличие от мускула, в Oracle || - конкатенация. Я на это сильно налетел, когда какой-то запрос в мускуле писал.
Т.е.
Код:
SQL> select 2||3 from dual;

2||3
------
23
2||3='23', т.е. не логическое OR!
01.03.2012 18:54
vdm
 
Я именно про это писал, что первые 2 параметра преобразуются в символьные строки, объединяются и сравниваются с 3-м.
Часовой пояс GMT +3, время: 08:07.

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