|   |   | 
| 
 | Получить количество дней без продаж | ☑ | ||
|---|---|---|---|---|
| 0
    
        Karambol 19.06.13✎ 11:07 | 
        Добрый день!
  УТ 10.3. Как получить максимальное количество дней без продаж по конкретному товару. Я вижу только такой вариант: сформировать таблицу с поступлениями/продажами и ее обрабатывать программно. Можно ли прямо в запросе рассчитать? | |||
| 1
    
        Deon 19.06.13✎ 11:10 | 
        посчитать кол-во дней, когда товар продавался     | |||
| 2
    
        Рэйв 19.06.13✎ 11:17 | 
        (0)Как вариант
  Получи запросом дни когда были продажи товара, закинь в тз. Потом добавь колонку, пройдись по тз и для каждой строки получи разницу в днях между тек. строкой и следующей. Потом стсортируешь по убыванию и в первой строке получишь максимум | |||
| 3
    
        ukolabrother 19.06.13✎ 11:19 | 
        выбрать из графика все дни, убрать дни с продажами     | |||
| 4
    
        Нуф-Нуф 19.06.13✎ 11:29 | 
        ВЫБРАТЬ
  ПродажиОбороты.Номенклатура КАК Номенклатура, НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК Период, ПродажиОбороты.КоличествоОборот КАК Количество ПОМЕСТИТЬ ТаблицаПродаж ИЗ РегистрНакопления.Продажи.Обороты(, , День, Номенклатура = &Номенклатура) КАК ПродажиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаПродаж.Номенклатура, ТаблицаПродаж.Период, МИНИМУМ(ВЫБОР КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0 ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ) КОНЕЦ) КАК Разница ПОМЕСТИТЬ ТаблицаРазницыДней ИЗ ТаблицаПродаж КАК ТаблицаПродаж, ТаблицаПродаж КАК ТаблицаПродажДляСоединения ГДЕ ВЫБОР КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0 ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ) КОНЕЦ > 0 СГРУППИРОВАТЬ ПО ТаблицаПродаж.Номенклатура, ТаблицаПродаж.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаРазницыДней.Номенклатура, МАКСИМУМ(ТаблицаРазницыДней.Разница) КАК Разница ИЗ ТаблицаРазницыДней КАК ТаблицаРазницыДней СГРУППИРОВАТЬ ПО ТаблицаРазницыДней.Номенклатура | |||
| 5
    
        Нуф-Нуф 19.06.13✎ 11:29 | 
        с вас 2000 руб.     | |||
| 6
    
        zak555 19.06.13✎ 11:34 | 
        (4) это если товар хоть один раз продавался за период     | |||
| 7
    
        Нуф-Нуф 19.06.13✎ 11:39 | 
        (6)
  ВЫБРАТЬ ПродажиОбороты.Номенклатура КАК Номенклатура, НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК Период, ПродажиОбороты.КоличествоОборот КАК Количество ПОМЕСТИТЬ ТаблицаПродаж ИЗ РегистрНакопления.Продажи.Обороты(&НачалоПериода, &ОкончаниеПериода, День, Номенклатура = &Номенклатура) КАК ПродажиОбороты ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Номенклатура, НАЧАЛОПЕРИОДА(&НачалоПериода, ДЕНЬ), 1 ОБЪЕДИНИТЬ ВСЕ ВЫБРАТЬ &Номенклатура, НАЧАЛОПЕРИОДА(&ОкончаниеПериода, ДЕНЬ), 1 ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаПродаж.Номенклатура, ТаблицаПродаж.Период, МИНИМУМ(ВЫБОР КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0 ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ) КОНЕЦ) КАК Разница ПОМЕСТИТЬ ТаблицаРазницыДней ИЗ ТаблицаПродаж КАК ТаблицаПродаж, ТаблицаПродаж КАК ТаблицаПродажДляСоединения ГДЕ ВЫБОР КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0 ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ) КОНЕЦ > 0 СГРУППИРОВАТЬ ПО ТаблицаПродаж.Номенклатура, ТаблицаПродаж.Период ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаРазницыДней.Номенклатура, МАКСИМУМ(ТаблицаРазницыДней.Разница) КАК Разница ИЗ ТаблицаРазницыДней КАК ТаблицаРазницыДней СГРУППИРОВАТЬ ПО ТаблицаРазницыДней.Номенклатура | |||
| 8
    
        Csar 19.06.13✎ 11:40 | 
        Можно пояснить раздел?
  ВЫБРАТЬ ТаблицаПродаж.Номенклатура, ТаблицаПродаж.Период, МИНИМУМ(ВЫБОР КОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) >= 0 ТОГДА РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) ИНАЧЕ РАЗНОСТЬДАТ(ТаблицаПродажДляСоединения.Период, ТаблицаПродаж.Период, ДЕНЬ) КОНЕЦ) КАК Разница ПОМЕСТИТЬ ТаблицаРазницыДней ИЗ ТаблицаПродаж КАК ТаблицаПродаж, ТаблицаПродаж КАК ТаблицаПродажДляСоединения Тут из ВТ ТаблицаПродаж перебираются все даты и создается выборка с минимумом дней простоя по отношению к каждому дня продажи? | |||
| 9
    
        Нуф-Нуф 19.06.13✎ 11:50 | 
        (8) да. мы для каждой даты продажи получаем варианты со всеми датами, получаем разницу с этими вариантами, и выбираем минимальную (т.е. для каждой даты продажи получаем разницу дней до ближайшей к ней дате продажи)     | |||
| 10
    
        Csar 19.06.13✎ 12:02 | 
        (9) оригинально     | |||
| 11
    
        IamAlexy 19.06.13✎ 12:02 | 
        (0) найти последнюю дату продажи и посчитать количество дней между оной и нужной ?     | |||
| 12
    
        Csar 19.06.13✎ 12:04 | 
        (11) так это ты ерунду получишь     | |||
| 13
    
        zak555 19.06.13✎ 12:17 | 
        (4) зачем тебе выбор в выборке и в условии ?     | |||
| 14
    
        Нуф-Нуф 19.06.13✎ 12:19 | 
        (13) потому что мне нужно получить разницу для каждой записи. и получить только те записи, для которой разница больше 0.
  хотя при умножении таблиц можно было поставить условие по неравенству дат (чтобы избежать 0 в принципе). хз что лучше | |||
| 15
    
        zak555 19.06.13✎ 12:20 | 
        (14) достаточно было бы
  указать ВЫБРАТЬ РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) .... ГДЕ РАЗНОСТЬДАТ(ТаблицаПродаж.Период, ТаблицаПродажДляСоединения.Период, ДЕНЬ) > 0 | |||
| 16
    
        zak555 19.06.13✎ 12:22 | 
        хотя равесто лучше отсевать в соединении
  ТаблицаПродаж ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПродажДляСоединения ПО ТаблицаПродаж.Период <> ТаблицаПродажДляСоединения.Период | |||
| 17
    
        Нуф-Нуф 19.06.13✎ 12:30 | 
        (15) ты получишь не все разницы дат. так как разница может быть и отрицательно
  (16) если таблица будет большая, то условие на неравенство при умножении таблиц возможно будет не самым лучшим вариантом | |||
| 18
    
        zak555 19.06.13✎ 12:32 | 
        (17)
  1. я их отсеиваю, т.к. они мне не интересны 2. это надо проверять | |||
| 19
    
        Нуф-Нуф 19.06.13✎ 12:34 | 
        (18) кстати да. точно. отрицательные даты - это тоже самое что и положительные :)))) только полученные другим вычислением Большее-Меньшее и Меньшее-Большее.
  Да, ты прав. можно выбор убрать и в условии просто >0 | |||
| 20
    
        zak555 19.06.13✎ 12:44 | 
        (7) смотри товар, который не продавался
  с 01.01 по 31.01 => у тебя выведет количество 30 дней, что неправильно =))) | |||
| 21
    
        Нуф-Нуф 19.06.13✎ 12:58 | 
        (20) почему?     | |||
| 22
    
        zak555 19.06.13✎ 13:13 | 
        (21) сколько будет по-твоему ?     | |||
| 23
    
        zak555 19.06.13✎ 16:41 | 
        вот надо было
  ВЫБРАТЬ ПродажиОбороты.Номенклатура, НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК ДеньПродажи ПОМЕСТИТЬ ТаблицаПродаж ИЗ РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, День, Номенклатура В (&Номенклатура)) КАК ПродажиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаПродаж.Номенклатура КАК Номенклатура, НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) КАК ДеньПродажи ПОМЕСТИТЬ ТаблицаПродажПолная ИЗ ТаблицаПродаж КАК ТаблицаПродаж ОБЪЕДИНИТЬ ВЫБРАТЬ ТаблицаПродаж.Номенклатура, ТаблицаПродаж.ДеньПродажи ИЗ ТаблицаПродаж КАК ТаблицаПродаж ОБЪЕДИНИТЬ ВЫБРАТЬ ТаблицаПродаж.Номенклатура, НАЧАЛОПЕРИОДА(&Дата2, ДЕНЬ) ИЗ ТаблицаПродаж КАК ТаблицаПродаж ИНДЕКСИРОВАТЬ ПО Номенклатура, ДеньПродажи ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаПродажПолная1.Номенклатура, МАКСИМУМ(РАЗНОСТЬДАТ(ТаблицаПродажПолная1.ДеньПродажи, ТаблицаПродажПолная2.ДеньПродажи, ДЕНЬ)) КАК КоличествоДнейМеждуПродажами ИЗ ТаблицаПродажПолная КАК ТаблицаПродажПолная1 ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаПродажПолная КАК ТаблицаПродажПолная2 ПО ТаблицаПродажПолная1.ДеньПродажи <> ТаблицаПродажПолная2.ДеньПродажи ГДЕ РАЗНОСТЬДАТ(ТаблицаПродажПолная1.ДеньПродажи, ТаблицаПродажПолная2.ДеньПродажи, ДЕНЬ) > 0 СГРУППИРОВАТЬ ПО ТаблицаПродажПолная1.Номенклатура | |||
| 24
    
        Нуф-Нуф 19.06.13✎ 16:46 | 
        (23) а сам пробовал его выполнить?     | |||
| 25
    
        Aprobator 19.06.13✎ 16:52 | 
        (23) фигня откровенная.     | |||
| 26
    
        zak555 19.06.13✎ 16:55 | 
        (24) не работает ?
  (25) в чём ? | |||
| 27
    
        Нуф-Нуф 19.06.13✎ 16:55 | 
        (24) не работает     | |||
| 28
    
        Aprobator 19.06.13✎ 16:59 | 
        (26) дни без продаж между двумя ближайшими продажами. А у тебя что? Макисмальная разница между ДЮБЫМИ различными датами продажи под данной номенклатуре.     | |||
| 29
    
        Aprobator 19.06.13✎ 17:00 | 
        блин - чего то пальцы по клавиатуре попадают криво )     | |||
| 30
    
        zak555 20.06.13✎ 12:34 | 
        да, ошибся, надо было так :
  ВЫБРАТЬ ПродажиОбороты.Номенклатура, НАЧАЛОПЕРИОДА(ПродажиОбороты.Период, ДЕНЬ) КАК ДеньПродажи ПОМЕСТИТЬ ТаблицаПродаж ИЗ РегистрНакопления.Продажи.Обороты(&Дата1, &Дата2, День, Номенклатура В (&Номенклатура)) КАК ПродажиОбороты ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ТаблицаПродаж.Номенклатура КАК Номенклатура, ТаблицаПродаж.ДеньПродажи КАК ДеньПродажи ПОМЕСТИТЬ ТаблицаПродажПолная ИЗ ТаблицаПродаж КАК ТаблицаПродаж ОБЪЕДИНИТЬ ВЫБРАТЬ ТаблицаПродаж.Номенклатура, НАЧАЛОПЕРИОДА(&Дата1, ДЕНЬ) ИЗ ТаблицаПродаж КАК ТаблицаПродаж ОБЪЕДИНИТЬ ВЫБРАТЬ ТаблицаПродаж.Номенклатура, НАЧАЛОПЕРИОДА(&Дата2, ДЕНЬ) ИЗ ТаблицаПродаж КАК ТаблицаПродаж ИНДЕКСИРОВАТЬ ПО Номенклатура, ДеньПродажи ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ВложенныйЗапрос.Номенклатура, МАКСИМУМ(ВложенныйЗапрос.КолДней) КАК КолДней ИЗ (ВЫБРАТЬ ТаблицаПродажПолная1.Номенклатура КАК Номенклатура, ТаблицаПродажПолная1.ДеньПродажи КАК ДеньПродажи, МИНИМУМ(РАЗНОСТЬДАТ(ТаблицаПродажПолная1.ДеньПродажи, ТаблицаПродажПолная2.ДеньПродажи, ДЕНЬ)) КАК КолДней ИЗ ТаблицаПродажПолная КАК ТаблицаПродажПолная1 ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаПродажПолная КАК ТаблицаПродажПолная2 ПО ТаблицаПродажПолная1.Номенклатура = ТаблицаПродажПолная2.Номенклатура И ТаблицаПродажПолная1.ДеньПродажи <> ТаблицаПродажПолная2.ДеньПродажи ГДЕ РАЗНОСТЬДАТ(ТаблицаПродажПолная1.ДеньПродажи, ТаблицаПродажПолная2.ДеньПродажи, ДЕНЬ) > 0 СГРУППИРОВАТЬ ПО ТаблицаПродажПолная1.Номенклатура, ТаблицаПродажПолная1.ДеньПродажи) КАК ВложенныйЗапрос СГРУППИРОВАТЬ ПО ВложенныйЗапрос.Номенклатура | |||
| 31
    
        zak555 20.06.13✎ 12:50 | 
        хотя
  ТаблицаПродажПолная1.ДеньПродажи <> ТаблицаПродажПолная2.ДеньПродажи лучше заменить на ТаблицаПродажПолная1.ДеньПродажи <= ТаблицаПродажПолная2.ДеньПродажи | |||
| 32
    
        GANR 20.06.13✎ 12:58 | 
        (0) > Можно ли прямо в запросе
  Да, можно, для этого нужно 1. Сгенерировать последоватьельность дат с периодичностью ДЕНЬ. В этом поможет Книга знаний: Генерация числовой последовательности и последовательности дат при помощи языка запросов. 2. Соединить п.1 с таблицей продаж по дням по условию на товар и на дату. 3. Ввести поле сумма(выбор когда [п.2].Период есть null тогда 1 иначе 0 конец) Все понятно? | |||
| 33
    
        GANR 20.06.13✎ 13:00 | 
        (32) А хотя можно и проще - вычесть количество дней, когда продажи были из общего количества дней в периоде - тогда и мудрить ничего не надо. (0) Забей на (32) - читай настоящее сообщение, эта идея перспективнее.     | |||
| 34
    
        Aprobator 20.06.13✎ 14:24 | 
        (30) опять мимо кассы.     | |||
| 35
    
        Aprobator 20.06.13✎ 14:26 | 
        хотя, при условии в (31) сработает.     | |||
| 36
    
        zak555 20.06.13✎ 14:47 | 
        (34) сработает и так, и так (35)     | |||
| 37
    
        zak555 20.06.13✎ 14:53 | 
        условие (31) можно и вовсе убрать     | |||
| 38
    
        dk 20.06.13✎ 15:02 | 
        небольшой взброс:
  надо еще учитывать чтобы товар был на остатках т.е. смотреть отсутствие продаж при наличии на складе ) | |||
| 39
    
        Aprobator 20.06.13✎ 15:06 | 
        (37) *почесав немного репу* - вообще да, согласен. Сработает и так и так.     | |||
| 40
    
        V_V_V 20.06.13✎ 15:11 | 
        А слабо выходные убрать?  :)     | |||
| 41
    
        zak555 20.06.13✎ 15:17 | 
        (38) интересует факт продажи     | |||
| 42
    
        zak555 20.06.13✎ 15:17 | 
        (40) зачем ?     | |||
| 43
    
        dk 20.06.13✎ 15:19 | 
        (41) в (0) написано про отсутствие продаж     | |||
| 44
    
        zak555 20.06.13✎ 15:21 | 
        (43) так в (30) для тех, кто хотя бы один раз продавался
  если нужно дополнить -- то вт правое соединение есть нул | |||
| 45
    
        zak555 20.06.13✎ 15:24 | 
        и его дополняем 
  РАЗНОСТЬДАТ(&Дата2, &Дата1, ДЕНЬ) + 86400 | |||
| 46
    
        dk 20.06.13✎ 15:28 | 
        (44) остатки прикрутить легко тока на словах )     | |||
| 47
    
        zak555 20.06.13✎ 15:29 | 
        (46) причём тут остатки ?
  ты же говоришь, что нужно добавить в результат те, номенклатуры, которые не продавались ? | |||
| 48
    
        dk 20.06.13✎ 15:30 | 
        не продавались, но БЫЛИ на остатках     | |||
| 49
    
        zak555 20.06.13✎ 16:34 | 
        (48) про это точно ни слова =)     | |||
| 50
    
        zak555 24.06.13✎ 08:11 | 
        автор пропал     | |||
| 51
    
        zak555 24.06.13✎ 22:07 | 
        кстати, как лучше ускорить (30) и (31) ?     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |