Форум OlegON > Компьютеры и Программное обеспечение > Операционные системы и программное обеспечение > Программирование

Задачи для обучения SQL-запросам в Супермаге : Программирование

19.04.2024 19:24


19.11.2014 13:46
Mtirt
 
Тебе длинный или короткий способ решения?
Если короткий, то надо почитать про аналитические функции оракла.
Рекомендую начать с Тома Кайта "Oracle для профессионалов". 2 том, если я правильно помню.
19.11.2014 13:48
Mtirt
 
Цитата:
Dim limit и order by
Limit это из mysql. В Oracle всё немного по-другому...
19.11.2014 13:53
Dim
 
сорри, все перепуталось в доме... (с)
19.11.2014 16:55
BotMan
 
собственно начитался и что-то написал.
смущает все же.

Код:
select article, SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat from (select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat, 
row_number() over ( order by s.createdat desc) rn
 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 where sp.article = '&article'
 and sp.article = crd.article
 and sp.doctype in ('WI')
 and s.createdat <= trunc(sysdate+1)
 and s.id = sp.docid
group by sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat
having  DOCID like 'ПН%' or docid like 'АП%' 
order by  6 desc)
where rn =1
20.11.2014 06:54
Mtirt
 
Принцип верный. Только замечаний у меня получилось достаточно много...

1. Я не понимаю, зачем тебе во вложенном запросе нужен group by. Изначально не понимала, и сейчас не понимаю. Кстати, order by тоже...
1а. Какой смысл у having DOCID like 'ПН%' or docid like 'АП%' ? Особенно у docid like 'АП%' , при условии, если изначально ты отобрал только приходные накладные?
2. Какой смысл у условия and s.createdat <= trunc(sysdate+1) ? Почему завтрашние документы надо отбирать, а послезавтрашние нельзя???
3. А сделай этот запрос не по одному артикулу. В row_number() надо добавить условие partition by.
4. Во вложенном запросе не хватает условия на соединение smspec и smdocuments по doctype
5. В принципе, лучше smcard перенести из вложенного запроса во внешний. Хотя, это дело вкуса.
20.11.2014 09:45
BotMan
 
Код:
select article, SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat from (select sp.article, crd.SHORTNAME, round(Itemprice), round(Itempricenotax), DOCID, createdat, 
row_number() over ( order by s.createdat desc) rn
 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 where sp.article = '&article'
 and sp.article = crd.article
 and sp.doctype in ('WI')
 and s.id = sp.docid
group by sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat
having  DOCID like 'ПН%')
where rn =1
это я черновик свой вкинул, не проверив

Код:
having  DOCID like 'ПН%'
сие чудо добавил так как попадаются компенсационные накладные приходные, решил их откинуть.
с таким запросом вроде уже работает нормально. сильно не тестил.
сейчас попробую допилить.
20.11.2014 09:54
Mtirt
 
Цитата:
BotMan сие чудо добавил так как попадаются компенсационные накладные приходные, решил их откинуть.
Компенсационные, это какие? Инвентаризация излишков?
Так лучше добавить условие отбора на вид операции, чем на номер...
Префикс поменяться может. Условие на равенство практически всегда работает быстрее, чем сравнение Like.
Коды операций можно посмотреть в Разделы - Настройка - Справочники - Документы - Виды операций.
20.11.2014 10:14
BotMan
 
Код:
select article, SHORTNAME, round(Itemprice), round(Itempricenotax), DOCID, createdat, rn from (select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat, 
row_number() over ( order by createdat desc) rn
 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 where sp.article = '&article' 
 and sp.article = crd.article
 and sp.doctype in ('WI')
 and s.doctype = sp.doctype 
 and s.id = sp.docid
 and  opcode = 0 )
 where rn =1
сделал вот так.

если вставляю
Код:
(partition by createdat order by createdat desc)
тогда параметр rn почему-то всегда равен 1.
20.11.2014 10:17
Mtirt
 
Ну наверное потому, что отбираешь по одному артикулу и делишь на кусочки по датам...
Убери условие: sp.article = '&article' . Лучше добавь условие на какую нибудь небольшую группу товаров...
Вставь (partition by sp.article order by s.createdat desc) и посмотри что будет во внутреннем запросе.
20.11.2014 10:52
BotMan
 
Код:
select article, SHORTNAME, round(Itemprice), round(Itempricenotax), DOCID, createdat, rn 

       from (select sp.article, crd.SHORTNAME, Itemprice, Itempricenotax, DOCID, createdat, row_number() over ( partition by sp.article order by s.createdat desc) rn

 from supermag.smcard crd, supermag.smspec sp, supermag.smdocuments s
 
-- where sp.article = '&article' 
 --and sp.article = crd.article
 where s.doctype = sp.doctype
 and crd.idclass in (select idclass from sacardclass where tree = '1.26.1.1')
 and sp.doctype in ('WI')
 and s.id = sp.docid
 and  opcode = 0 )
 
 where rn =1
сделал такой запрос, но так и не дождался его завершения, отменил.
Часовой пояс GMT +3, время: 19:24.

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