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