Имя: Пароль:
1C
 
Помогите с запросом. Новые клиенты
,
0 SuperUser
 
05.06.17
09:05
Туплю, не могу сделать запрос, где выбираются новые клиенты за период. Новые - если первая продажа была в выбранном периоде

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты
;

//////////////////////////////////////////////////////////////////////////////// Получаю здесь дату
ВЫБРАТЬ
    Продажи.Контрагент,
    МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК ДатаПродажи
ПОМЕСТИТЬ ПродажиСДатами
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Продажи КАК Продажи
        ПО РеализацияТоваровУслуг.Контрагент = Продажи.Контрагент

СГРУППИРОВАТЬ ПО
    Продажи.Контрагент
;

Как отсюда убрать тех, кто покупал ранее?
1 RomaH
 
naïve
05.06.17
09:07
ПО РеализацияТоваровУслуг.Контрагент = Продажи.Контрагент
И дата <  Дата

где есть null
2 torgm
 
05.06.17
09:12
(0) можно  поразному ,
можно количество покупок =1
можно  минимальнаядатапокупки=максимальнаядатапокупки
и т.д. и т.п.
3 SuperUser
 
05.06.17
09:17
(1) (2) Спасибо
4 mc lammer
 
05.06.17
09:26
(2)
//количество покупок =1 можно  минимальнаядатапокупки=максимальнаядатапокупки

некорректные условия
5 Ёпрст
 
05.06.17
09:30
(0)
Имеющие  МАКСИМУМ(РеализацияТоваровУслуг.Дата) Между &Начпериода и &КонПериода
6 Ёпрст
 
05.06.17
09:31
(0) Ну и там не максимум нужен везде, а МИНИМУМ.
7 Ёпрст
 
05.06.17
09:34
+6


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрНакопления.Продажи.Обороты(&Начпериода, &КонПериода, , ) КАК ПродажиОбороты
;

//////////////////////////////////////////////////////////////////////////////// Получаю здесь дату

ВЫБРАТЬ
    Продажи.Контрагент
ИЗ
    Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Продажи КАК Продажи
        ПО РеализацияТоваровУслуг.Контрагент = Продажи.Контрагент

СГРУППИРОВАТЬ ПО
    Продажи.Контрагент
Имеющие МИНИМУМ(РеализацияТоваровУслуг.Дата) Между &Начпериода и &КонПериода
8 dezss
 
05.06.17
09:36
(7) не учитывается, были раньше продажи или нет.
Тут же надо выбрать только тех, кому была первая продажа в периоде, а до этого их не было.

ИМХО, надо просто отсекать тех, кому до начала периода хоть что-то продавали, а потом уже выбирать тех, кому за этот период продавали.
9 Ёпрст
 
05.06.17
09:40
(8) И ? Еще раз подумай.
10 Ёпрст
 
05.06.17
09:41
+9 да, внутреннее соединение тут усё портит
11 Ёпрст
 
05.06.17
09:42
хотя не, всё норм там. Унутреннее, только на клиентоса фильтр накладывает.
12 dezss
 
05.06.17
09:47
(9) недосмотрел ИМЕЮЩИЕ
но лучше такие конструкции не использовать, медленнее будет.
ИМХО, лучше левым
     РегистрНакопления.Продажи.Обороты(, &Начпериода, , ) как ОборИскл
ГДЕ
   ОборИскл.Контрагент есть null

хотя надо пробовать и смотреть что быстрей отработает.
13 SuperUser
 
05.06.17
09:47
Сделал Так

ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ Продажи
ИЗ
    РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    Продажи.Контрагент,
    МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК ДатаПродажи
ПОМЕСТИТЬ СДатами
ИЗ
    Продажи КАК Продажи
        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО (РеализацияТоваровУслуг.Контрагент = Продажи.Контрагент)
            И (РеализацияТоваровУслуг.Дата < &Начало)

СГРУППИРОВАТЬ ПО
    Продажи.Контрагент
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    СДатами.Контрагент,
    СДатами.ДатаПродажи,
    РеализацияТоваровУслуг.Дата
ИЗ
    СДатами КАК СДатами
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
        ПО СДатами.Контрагент = РеализацияТоваровУслуг.Контрагент
ГДЕ
    СДатами.ДатаПродажи ЕСТЬ NULL

(11) Попробую твой вариант
14 dezss
 
05.06.17
09:53
(13) лучше используй не Документ.РеализацияТоваровУслуг, а РегистрНакопления.Продажи.
Там есть индексы, а это ускорит выборку, хотя опять таки, надо пробовать, есть ли именно те индексы, которые тебе нужны. Придется отказаться от использования вирт. таблиц, но это может ускорить.
15 eryomin
 
05.06.17
09:59
(13) может, лучше так?
<CODE>
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ Клиенты
ИЗ
    РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ КлиентыСтарые
ИЗ
    РегистрНакопления.Продажи.Обороты(, &Начало, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Продажи.Контрагент,
    МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК ДатаПродажи
ПОМЕСТИТЬ СДатами
ИЗ
    Клиенты КАК Клиенты
        ЛЕВОЕ СОЕДИНЕНИЕ КлиентыСтарые КАК КлиентыСтарые
        ПО Клиенты.Контрагент = КлиентыСтарые.Контрагент
ГДЕ
    КлиентыСтарые.Контрагент ЕСТЬ NULL
</CODE>
16 НЕА123
 
05.06.17
10:00
ВЫБРАТЬ
    Продажи.Контрагент
ИЗ
    РегистрНакопления.Продажи КАК Продажи

СГРУППИРОВАТЬ ПО Продажи.Контрагент
Имеющие Продажи.Период > &КонПериода


ИМХО не только РеализацияТоваровУслуг есть продажа.
17 eryomin
 
05.06.17
10:01
Конечно же:
<CODE>
...
ВЫБРАТЬ
    Клиенты.Контрагент
...
</CODE>
18 НЕА123
 
05.06.17
10:01
*
Имеющие МИНИМУМ(Продажи.Период) > &КонПериода
19 eryomin
 
05.06.17
10:07
попробую еще раз:
<CODE>
ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ Клиенты
ИЗ
    РегистрНакопления.Продажи.Обороты(&Начало, &Конец, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////


ВЫБРАТЬ РАЗЛИЧНЫЕ
    ПродажиОбороты.Контрагент
ПОМЕСТИТЬ КлиентыСтарые
ИЗ
    РегистрНакопления.Продажи.Обороты(, &Начало, , ) КАК ПродажиОбороты
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    Клиенты
ИЗ
    Клиенты КАК Клиенты
        ЛЕВОЕ СОЕДИНЕНИЕ КлиентыСтарые КАК КлиентыСтарые
        ПО Клиенты.Контрагент = КлиентыСтарые.Контрагент
ГДЕ
    КлиентыСтарые.Контрагент ЕСТЬ NULL
</CODE>
20 eryomin
 
05.06.17
10:07
что-то ни фига не получается с форматированием
21 dezss
 
05.06.17
10:21
(16) ПродажиОбороты.Регистратор ссылка документ.РеализацияТоваровУслуг

тока в вирт таблицах их нет, кажись...но один фиг, будет же индекс
22 patria0muerte
 
05.06.17
10:50
ВЫБРАТЬ РАЗРЕШЕННЫЕ
    МИНИМУМ(Т.Период) КАК Период,
    Т.Контрагент
ИЗ
    РегистрНакопления.Продажи.Обороты(, , День, ) КАК Т

СГРУППИРОВАТЬ ПО
    Т.Контрагент

ИМЕЮЩИЕ
    МИНИМУМ(Т.Период) >= &ГраницаПроверки
23 eryomin
 
05.06.17
11:02
(22) и всего делов-то :)
24 dezss
 
05.06.17
11:05
(22) ага-ага...у виртуальной таблицы есть период, ага...
25 patria0muerte
 
05.06.17
11:06
(23) Ну, подобное предложили еще в (16). Только к реальной таблице обращаясь.

Вообще по быстродействию не особо, неплохо бы какие-то отборы все же задать. Т.е. например, клиент, который не покупал более 3х - лет считается новым. И т.д...

(24) Если это сарказм, то я его не понял..
26 eryomin
 
05.06.17
11:07
(24) период есть, но можно и без виртуальной таблицы обойтись
27 patria0muerte
 
05.06.17
11:10
Если без отборов, то видимо действительно лучше к реальной таблице обратиться. По быстродействию чуть веселее у меня вышло..
28 НЕА123
 
05.06.17
11:10
почти ОФФ
у виртуальной таблицы можно все-таки Период получить?
29 dezss
 
05.06.17
11:10
(26) хм...а у меня нету...вот прям стопудова нету...скопипастил этот запрос и ругаеццо...
30 eryomin
 
05.06.17
11:12
(29) зато у тебя, наверное, есть ПериодДень, ПериодМесяц ... :)
31 eryomin
 
05.06.17
11:16
(28) да, задавай конкретную периодичность
32 eryomin
 
05.06.17
11:19
(27) конечно
33 dezss
 
05.06.17
11:38
(30) тьфу....понял...