Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

 Помогите посчитать количество дней которые товар был на складе [MSSQL]


Страницы:   1 2

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]

Ну а в каком поле эти даты записаны?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо