[ОТВЕТИТЬ]
Опции темы
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...E7%E0%F6%E8%FF столкнулся с конструкцией
Код:
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!
 
"Спасибо" OlegON от:
01.03.2012 18:54  
vdm
Я именно про это писал, что первые 2 параметра преобразуются в символьные строки, объединяются и сравниваются с 3-м.
 
"Спасибо" vdm от:
 
Опции темы



Часовой пояс GMT +3, время: 03:12.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.