19.11.2007 20:24
rost
 
Всем Добрый вечер!!!
Помогите с пожалуйста с запросом:
Необходимо по таблицам SMSpec и SMDocuments получить результат в виде:
Код товара КолВоД

000001 5
000002 90
000003 10

Где КолВоД - количество дней, когда количество товара больше нуля.

Количество товара получаю с помощью двух запросов, объединенных UNION ALL, но ведь не вычислять же количество каждый день, по каждому товару ???
Думаю, что нужно отталкиваться от остатков на дату начала и прибавляя все приходы и расходы получать остатки на каждый день.

Заранее благодарю.
19.11.2007 21:42
OlegON
 
Цитата:
rost Где КолВоД - количество дней, когда количество товара больше нуля.
Не уверен, что кто-то возьмется, очень нехилый скрипт. И, главное, если за весь срок жизни базы - очень маленькая база должна быть ;) И ценность полученной информации тоже сомнительна. Если накладную держали месяц в статусе "принят на складе", это считается или нет? А если накладную сделали вечером? И как быть с пересортом? Посмотри на статистику (рассчитывается в Аналитике административного модуля), может там что-то полезное найдешь.
19.11.2007 22:30
rost
 
Просто интересна сама методика написания подобных запросов.
Могу реализовать в цикле из среды программирования, той же 1С, с последующим анализом, но кидать кучу запросов, ИМХО изврат.
19.11.2007 22:57
OlegON
 
Подобные запросы называются динамическим SQL, по скорости работы тормознее среды программирования порой в десятки раз, а иногда и вообще базу положить можно. Кому-то я такую сортировочку один раз сделал :(
19.11.2007 23:09
rost
 
А нельзя ли тогда реализовать сабж с помощью дополнительной таблицы и связки OVER PARTITION BY.
PS В дополнительную таблицу помещать приращения за день.
19.11.2007 23:44
OlegON
 
Я сейчас делаю джобом аналитикам информацию об остатках за текущий день, аналогичное можно и тебе сделать. Связку такую тоже можно сделать, хоть и не очень представляю, как она тут уложится. Не суть. Мне динамический sql не нравится, только в случае крайней необходимости. А без него тут не обойтись, мне кажется.
20.11.2007 09:16
kadr
 
Цитата:
rost Всем Добрый вечер!!!
Помогите с пожалуйста с запросом:
Необходимо по таблицам SMSpec и SMDocuments получить результат в виде:
Код товара КолВоД

000001 5
000002 90
000003 10

Где КолВоД - количество дней, когда количество товара больше нуля.

Количество товара получаю с помощью двух запросов, объединенных UNION ALL, но ведь не вычислять же количество каждый день, по каждому товару ???
Думаю, что нужно отталкиваться от остатков на дату начала и прибавляя все приходы и расходы получать остатки на каждый день.

Заранее благодарю.
Давай для начала определимся в терминах и определениях:

"количество дней, когда количество товара больше нуля"
под этим можно понимать следующие ситуации: (под утром и вечером понимается начало суток и конец суток)
товар утром был, было движение и вечером есть остатки
товар утром был, бало движение и вечером нет остатков
товар утром был не было движения и вечером есть остатки
товара утром не было, было движение и вечером есть остатки
товара утром не было, было движение и вечером нет остатков

все эти ситуации обсчитываются разными способами, но принцип всё равно один:
тебе для каждого дня надо делать обсчёт.
В административном модуле есть закладка "статистика", там можно делать автомтический рассчёт по результатам товародвижения, но необходимо учитывать что данная процедура очень ресурсоёмкая и на больших периодах рассчёта может затянуться на длительное время
20.11.2007 09:34
Mtirt
 
Могу отдать вот этот скрипт.
Код:
select dt,
               article,
               locid,
               sum(quant) over(partition by locid, article order by dt) ost
               from (select dt, article, sum(quantity) quant, locid
                  from (select d.createdat dt,
                               t.article,
                               t.quantity,
                               d.locationto locid
                          from smdocuments d, smspec t
                         where d.doctype in ('WI', 'IW', 'CR')
                           and d.docstate >= 2
                           and d.doctype = t.doctype
                           and d.id = t.docid
                           and d.createdat <= :DateEnd
                           and t.article in
                               (select article
                                  from smcardassort
                                 where idassort = :assort)
                        union all
                        select d1.createdat dt,
                               t1.article,
                               -t1.quantity quantity,
                               d1.locationfrom locid
                          from smdocuments d1, smspec t1
                         where d1.doctype in ('WO', 'IW', 'CS')
                           and d1.docstate >= 2
                           and d1.doctype = t1.doctype
                           and d1.id = t1.docid
                           and d1.createdat <= :DateEnd
                           and t1.article in
                               (select article
                                  from smcardassort
                                 where idassort = :assort)
                        union all
                        select a.dt dt, b.article, 0 quantity, c.id locid
                          from dates a, smcard b, smstorelocations c
                         where a.dt between '01.04.2004' and :dateend
                           and b.article in
                               (select article
                                  from smcardassort
                                 where idassort = :assort)
                           and c.id <> -1)
                 group by dt, article, locid)
В ответ прошу протестировать правильность результатов.
Ну и всё сказанное Олегом к нему относится . Т.е. на больших ассортиментах лучше не запускать. Систему "грузит" очень нехило...
20.11.2007 10:47
rost
 
Kadr, Полностью согласен, но рассматриваю задачу скорее методологически. Допускаю, что нет пересорта, остатки корректны и беру я их на вечер.
Спасибо Mirt.
20.11.2007 10:52
rost
 
Mirt, правда не совсем понял, что такое таблица dates. Это наверное Твое ноу хау :)
Часовой пояс GMT +3, время: 09:56.

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