v8: Запрос: количество дней нахождения товара на складе.Есть много заковыристых задачек, которые часто встречаются в работе. Давайте попробуем решить одну из таких задач разными методами и попытаемся найти оптимальный. | | Автор статьи: TormozIT | Редакторы: Последняя редакция №4 от 01.09.06 | История URL: http://kb.mista.ru/article.php?id=359 | |
Задача.
Получить общее количество дней наличия товара на складе с группировками:
Номенклатура, ХарактеристикаНоменклатуры, Склад.
Проверочный набор данных
Приход Партия1 01.08.2006 1
Приход Партия2 02.08.2006 1
Расход Партия1 07.08.2006 1
Расход Партия2 07.08.2006 1
Решение дожно выдать 6.
Мое решение.
ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Склад КАК Склад,
СУММА(
ВЫБОР
КОГДА ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Период = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийПоложительныйПериод.ПоследнийПериод ТОГДА
ВЫБОР
КОГДА ПартииТоваровНаСкладахОстаткиИОборотыПоследнийПоложительныйПериод.ПоследнийПериод < ПартииТоваровНаСкладахОстаткиИОборотыПоследнийНеположительныйПериод.ПоследнийПериод ТОГДА
РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Период, ПартииТоваровНаСкладахОстаткиИОборотыПоследнийНеположительныйПериод.ПоследнийПериод, ДЕНЬ)
КОГДА ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.КоличествоКонечныйОстаток > 0 ТОГДА
РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.ПредыдущийПериод, &ДатаОтчета, ДЕНЬ)
ИНАЧЕ
РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Период, &ДатаОтчета, ДЕНЬ) + 1
КОНЕЦ
ИНАЧЕ
ВЫБОР
КОГДА ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.КоличествоКонечныйОстаток > 0 ТОГДА
РАЗНОСТЬДАТ(ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.ПредыдущийПериод, ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Период, ДЕНЬ)
ИНАЧЕ
1
КОНЕЦ
КОНЕЦ) КАК КоличествоДнейНаСкладе
ИЗ
( ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
ПартииТоваровНаСкладахОстаткиИОбороты.Период КАК Период,
ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(, , День, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты
ГДЕ
ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
) КАК ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды
ЛЕВОЕ СОЕДИНЕНИЕ
( ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
МАКСИМУМ(ПартииТоваровНаСкладахОстаткиИОбороты.Период) КАК ПоследнийПериод
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(, , День, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты
ГДЕ
ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток > 0
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты.Склад
) КАК ПартииТоваровНаСкладахОстаткиИОборотыПоследнийПоложительныйПериод
ПО ИСТИНА
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Номенклатура = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийПоложительныйПериод.Номенклатура
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийПоложительныйПериод.ХарактеристикаНоменклатуры
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Склад = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийПоложительныйПериод.Склад
ЛЕВОЕ СОЕДИНЕНИЕ
( ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты.Склад КАК Склад,
МАКСИМУМ(ПартииТоваровНаСкладахОстаткиИОбороты.Период) КАК ПоследнийПериод
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(, , День, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты
ГДЕ
ПартииТоваровНаСкладахОстаткиИОбороты.КоличествоКонечныйОстаток <= 0
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахОстаткиИОбороты.Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты.ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты.Склад
) КАК ПартииТоваровНаСкладахОстаткиИОборотыПоследнийНеположительныйПериод
ПО ИСТИНА
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Номенклатура = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийНеположительныйПериод.Номенклатура
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийНеположительныйПериод.ХарактеристикаНоменклатуры
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Склад = ПартииТоваровНаСкладахОстаткиИОборотыПоследнийНеположительныйПериод.Склад
ЛЕВОЕ СОЕДИНЕНИЕ
( ВЫБРАТЬ
ТаблицаПредыдущиеПериоды.Номенклатура КАК Номенклатура,
ТаблицаПредыдущиеПериоды.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ТаблицаПредыдущиеПериоды.Склад КАК Склад,
ТаблицаПредыдущиеПериоды.Период КАК Период,
ТаблицаПредыдущиеПериоды.ПредыдущийПериод КАК ПредыдущийПериод,
ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
( ВЫБРАТЬ
ПартииТоваровНаСкладахОстаткиИОбороты1.Номенклатура КАК Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты1.ХарактеристикаНоменклатуры КАК ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты1.Склад КАК Склад,
ПартииТоваровНаСкладахОстаткиИОбороты1.Период КАК Период,
МАКСИМУМ(ПартииТоваровНаСкладахОстаткиИОбороты2.Период) КАК ПредыдущийПериод
ИЗ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(, , День, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты1
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(, , День, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОбороты2
ПО (ИСТИНА)
И ПартииТоваровНаСкладахОстаткиИОбороты1.Номенклатура = ПартииТоваровНаСкладахОстаткиИОбороты2.Номенклатура
И ПартииТоваровНаСкладахОстаткиИОбороты1.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОбороты2.ХарактеристикаНоменклатуры
И ПартииТоваровНаСкладахОстаткиИОбороты1.Склад = ПартииТоваровНаСкладахОстаткиИОбороты2.Склад
И ПартииТоваровНаСкладахОстаткиИОбороты1.Период > ПартииТоваровНаСкладахОстаткиИОбороты2.Период
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахОстаткиИОбороты1.Номенклатура,
ПартииТоваровНаСкладахОстаткиИОбороты1.ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОбороты1.Склад,
ПартииТоваровНаСкладахОстаткиИОбороты1.Период
) КАК ТаблицаПредыдущиеПериоды
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.ПартииТоваровНаСкладах.ОстаткиИОбороты(, , День, , Номенклатура В ИЕРАРХИИ (&Номенклатура)) КАК ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие
ПО ИСТИНА
И ТаблицаПредыдущиеПериоды.Номенклатура = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.Номенклатура
И ТаблицаПредыдущиеПериоды.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.ХарактеристикаНоменклатуры
И ТаблицаПредыдущиеПериоды.Склад = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.Склад
И ТаблицаПредыдущиеПериоды.ПредыдущийПериод = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущие.Период
) КАК ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки
ПО ИСТИНА
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Номенклатура = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.Номенклатура
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.ХарактеристикаНоменклатуры = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.ХарактеристикаНоменклатуры
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Склад = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.Склад
И ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Период = ПартииТоваровНаСкладахОстаткиИОборотыПредыдущиеОстатки.Период
СГРУППИРОВАТЬ ПО
ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Номенклатура,
ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.ХарактеристикаНоменклатуры,
ПартииТоваровНаСкладахОстаткиИОборотыПоложительныеПериоды.Склад
АВТОУПОРЯДОЧИВАНИЕ |