![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите посчитать количество дней которые товар был на складе [MSSQL]
mvgfirst © (2003-05-16 17:14:00)Есть таблица "Обороты товара":
CREATE TABLE [RA219] (
[IDDOC] [char] (9) COLLATE Cyrillic_General_CI_AS NOT NULL , --Идентификатор документа
[DATE_TIME_IDDOC] [char] (23) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Дата+Время+Идентификатор документа
[SP290] [char] (9) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Идентификатор Контрагента
[SP291] [char] (9) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Идентификатор Товара
[SP292] [numeric](18, 3) NOT NULL , -- Количество прихода товара
[SP294] [numeric](18, 3) NOT NULL , -- Количество расхода товара
) ON [PRIMARY]
Нужно получить количество дней во время которых товар находился в организации (Количество_Прихода-Количество_Расхода <> 0). Т.е. нужно подсчитать количество дней в промежутках когда товар был на складах орагнизации. и не считать те промежутки когда товара небыло.
Serginio (2003-05-19 15:27:00) [21]Делаешь всего два запроса 1. Остатки товаров 2. Второй движение товаров желательно в формате товар дата приход расход продажа сгруппированные по товар дата а затем на клиенте обсчитываешь. Можно остатки загнать в память и обсчитывать каждый товар. Я правда обсчитываю ДБФ но например около 500 000 записей движений товара и всего за 6-12 сек на АМД 900.
kaif (2003-05-18 01:03:00) [22]2 mvgfirst (17.05.03 14:05)
Курсоры в MS SQL вовсе не медленная вещь. Я юзал курсоры и очень мне это дело понравилось, хоть это и плохой тон в SQL. В IB я обхожусь без всяких курсоров, но в MS SQL их приходилось использовать достаточно много и проблем больших я не видел. Кстати и создаются они в MS SQL очень легко.
Согласен, что я неточно понял твой вопрос о группировке.
В IB я обычно делаю так: у меня есть генератор набора дат (но это только в IB возможно, так как там существует SUSPEND внутри хранимых процедур и можно делать выборки, объединяющие результаты работы ХП с таблицами). На MS SQL можно сгенерить временную (или постояннцю) таблицу всех дат подряд, сделать объединение LEFT OUTER JOIN с таблицей движения товаров и суммирование с группировкой по дате из первой таблицы. Тогда ты получишь график по всемдатам. Кстати, если ты в таблице дат заведешь еще пару колонок (неделя, месяц), то сможешь получить группировку и по таким классным промежуткам ремени. Подумай, так как это очень хорошая идея. Единственно, что в ней плохо - сам LEFT OUTER JOIN, который не знаю, насколько корректно в MS SQL сочетается с агрегатными функциями. Но попробовать стоит.
mvgfirst (2003-05-17 14:05:00) [23]2 Sergino
То что ты говоришь на MS SQL можно сделать только используя курсоры. А это очень медленно. Так как такую операцию придется проводить для каждого товара а их может быть десятки тысяч.
Нужно решение которо можно выполнить одним запросом SQL и не использовать курсоры.
mvgfirst (2003-05-17 14:03:00) [24]2 kaif
Если делать так как ты говоришь то я получу итоги только по тем датам по которым были движения. А я спрашивал каким образом получить итоги на каждый день (не зависимо от того были ли движения в этот день) Т.е. нужно получить итоги на все даты в течении определенного периода
Serginio (2003-05-16 21:16:00) [25]Ухожу. Задай этот вопрос на
http://www.kuban.ru/cgi-bin/forum/forum9.cgi
А у меня сейчас нет времени да и желания. Подумай сам
Есть чудесная вещь называется Group By [DATE_TIME_IDDOC]
Но еще раз повторю тебе нужно получить два запроса а затем програмно отрабатывать.
Serginio (2003-05-16 20:57:00) [26]Одним запросом количество дней не получишь. Нужно сначала проверять начальные остатки а затем отслеживать все движения по дням. Когда остаток обнулится подсчитывается количество дней
текущаядата-датапоявлениятоваранаскладе+1. Если был приход а до этого остаток был равен 0 то датапоявлениятоваранаскладе=текущаядата.
И после окончания расчета если остатки >0 ДатаконцаРасчета-датапоявлениятоваранаскладе+1; Разумеется все ссумируется. Кстати в какойто типовой есть такого рода анализ.
kaif (2003-05-16 20:48:00) [27]>А может тогда скажете какой SQL конструкцией можно получить >итого по товару сгруппированные по датам но с дискретизацией по >одному дню?
Найди функцию, которая из даты-время, которой 1С поклоняется, просто дату делает (без времени), и в SELECT-е суммируй количество товара, группируя по результату работы этй функции.
А в чем цель задачи-то (определения того, сколько товар на складе лежал)? Если цель - выявить плохо продаваемые товары, то можно задачу по другому поставить - какой товар не имел ни одной продажи за заранее заданный период из числа тех, что имеются в данный момент на складе.
mvgfirst (2003-05-16 18:17:00) [28]Никто не поможет?
А может тогда скажете какой SQL конструкцией можно получить итого по товару сгруппированные по датам но с дискретизацией по одному дню?
mvgfirst (2003-05-16 17:49:00) [29]Структуру базы придумывал не я - это 1С :) Поэтому сильно ногами не пинайте :)
mvgfirst (2003-05-16 17:48:00) [30][DATE_TIME_IDDOC] [char] (23) COLLATE Cyrillic_General_CI_AS NOT NULL , -- Дата+Время+Идентификатор документа
NickBat (2003-05-16 17:21:00) [31]Ну а в каком поле эти даты записаны?