Имя: Пароль:
1C
 
Помогите составить запрос
0 Ksandr
 
12.03.09
09:00
Уважаемые программисты не могу додуматься как Выбрать для каждого контрагента первую сделку и две крайних средствами запроса?
Просто хочется на выходе получить
Контрагент 1 - Сделка 1
            - Сделка 198
            - Сделка 199
Средствами языка 1С - могу сам, но мне кажется, что запросом будет быстрее
1 Alpen906
 
12.03.09
09:06
Смотри в стророну ПЕРВЫЕ 1, ОБЪЕДИНИТЬ, ПЕРВЫЕ 2, УПОРЯДОЧИТЬ...
2 Ksandr
 
12.03.09
09:14
А как ВЫБРАТЬ ПЕРВЫЕ 1
Менеджер, МИНИМУМ(Период)
СГРУППИРОВАТЬ ПО Менеджер
??
3 Alpen906
 
12.03.09
09:25
Примерно так
|ВЫБРАТЬ ПЕРВЫЕ 1
|    Док.Ссылка
|ИЗ
|    Документ.ТвойДок КАК Док
|УПОРЯДОЧИТЬ ПО
|    Док.Дата ВОЗР
|
|ОББЪЕДИНИТЬ
|
|ВЫБРАТЬ ПЕРВЫЕ 2
|    Док.Ссылка
|ИЗ
|    Документ.ТвойДок КАК Док
|УПОРЯДОЧИТЬ ПО
|    Док.Дата УБЫВ";
4 Ksandr
 
12.03.09
09:50
А как это сделать для каждого контрагента?
5 Ksandr
 
12.03.09
09:50
Не циклом, а запросом
6 Ksandr
 
12.03.09
09:55
Может левое соединение спасет?
7 Alpen906
 
12.03.09
09:59
Первый запрос что ли в 1С пишешь?

|ВЫБРАТЬ
|    ВнутрЗапрос.Контрагент,
|    ВнутрЗапрос.Документ
|ИЗ (
|ВЫБРАТЬ ПЕРВЫЕ 1
|    Док.Контрагент КАК Контрагент,
|    Док.Ссылка КАК Документ
|ИЗ
|    Документ.ТвойДок КАК Док
|УПОРЯДОЧИТЬ ПО
|    Док.Дата ВОЗР
|
|ОББЪЕДИНИТЬ
|
|ВЫБРАТЬ ПЕРВЫЕ 2
|    Док.Контрагент,
|    Док.Ссылка
|ИЗ
|    Документ.ТвойДок КАК Док
|УПОРЯДОЧИТЬ ПО
|    Док.Дата УБЫВ) КАК ВнутрЗапрос
|ИТОГИ Количество(ВнутрЗапрос.Документ) ПО
|    ВнутрЗапрос.Контрагент"

Я работу запроса не проверял, но примерно так...
Далее смотри параметр ОбходРезультатаЗапроса метода Выбрать()
8 hhhh
 
12.03.09
09:59
(6) спасет, но не одно а штук 15 левых соединений
9 Ksandr
 
12.03.09
10:02
(7) Не первый, если хочешь, примеры своих запросов скину
10 73
 
12.03.09
10:04
(7) А ты бы проверил. Вернет то 3 строчки :)
11 Sadovnikov
 
12.03.09
10:04
(7) Фигню написал. Вернет тебе твой запрос 3 записи.
12 hhhh
 
12.03.09
10:05
(7) все равно же выдаст 3 строчки.
13 butterbean
 
12.03.09
10:06
[е выдаст 3 строчки.]
14 butterbean
 
12.03.09
10:08
(13)+ простите, баловался со скриптом от Asmody :-)
15 Sadovnikov
 
12.03.09
10:09
(0) Вот эту веточку почитай:
v8: Агрегатная функция МАКСИМУМ от ссылки
16 Sadovnikov
 
12.03.09
10:10
17 73
 
12.03.09
10:42
(0) Вот пока только минимум и максимум (и если по дате определиться можно):

ВЫБРАТЬ
   ЗаказПокупателя.Контрагент,
   ЗаказПокупателя.Создал,
   МИНИМУМ(ЗаказПокупателя.Дата) КАК Дата
ПОМЕСТИТЬ ПервыеЗаказыДата
ИЗ
   Документ.ЗаказПокупателя КАК ЗаказПокупателя

СГРУППИРОВАТЬ ПО
   ЗаказПокупателя.Контрагент,
   ЗаказПокупателя.Создал
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ЗаказПокупателя.Контрагент,
   ЗаказПокупателя.Создал,
   МАКСИМУМ(ЗаказПокупателя.Дата) КАК Дата
ПОМЕСТИТЬ ПоследниеЗаказыДата
ИЗ
   Документ.ЗаказПокупателя КАК ЗаказПокупателя

СГРУППИРОВАТЬ ПО
   ЗаказПокупателя.Контрагент,
   ЗаказПокупателя.Создал
;

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

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

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
   ПервыеЗаказы.Ссылка,
   ПервыеЗаказы.Дата КАК Дата,
   ПервыеЗаказы.Контрагент КАК Контрагент,
   ПервыеЗаказы.Создал КАК Создал
ИЗ
   ПервыеЗаказы КАК ПервыеЗаказы

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
   ПоследниеЗаказы.Ссылка,
   ПоследниеЗаказы.Дата,
   ПоследниеЗаказы.Контрагент,
   ПоследниеЗаказы.Создал
ИЗ
   ПоследниеЗаказы КАК ПоследниеЗаказы

УПОРЯДОЧИТЬ ПО
   Контрагент,
   Создал,
   Дата
18 73
 
12.03.09
11:15
Предпоследние еще актуальны?
19 ottto
 
12.03.09
11:43
проце мне кажется так сделать:

ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   Сделка.Ссылка КАК Документ
ИЗ
   Документ.Сделка КАК Сделка
       ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
       ПО (Сделка.Ссылка В
               (ВЫБРАТЬ ПЕРВЫЕ 3
                   СделкаК.Ссылка
               ИЗ
                   Документ.УС_Сделка КАК СделкаК
               ГДЕ
                   СделкаК.Контрагент = Контрагенты.Ссылка
               УПОРЯДОЧИТЬ ПО
                   СделкаК.Дата УБЫВ))
ИТОГИ ПО
   Контрагент
20 73
 
12.03.09
11:59
(19) Пробовал? Я не могу дождаться(вот уже 10 минут как выполняется твой запрос). Может и проще по количеству строк, но явно медленнее и пока не знаю правильно ли.
21 ottto
 
12.03.09
12:06
Корреляционное условие в соединении. А долго ждать- ну наверное много контрагентов в БД. Я обычно такие запросы-не выполняю. Использую условия.

Не дочитал -автору требуется получить первый + 2 последних документа. а этот код возвращает 3 последних документа для контрагента. Т.е. как бы срез последних 3-х.
22 Ksandr
 
12.03.09
12:10
А если объединить его с другим то можно получить и то что нужно
23 73
 
12.03.09
12:10
(21) Контрагентов такое же количество, на котором я проверял запрос из (17).
24 73
 
12.03.09
12:10
(22) Сколько контрагентов имеешь?
25 Ksandr
 
12.03.09
12:11
тысяч 7-9
26 Ksandr
 
12.03.09
12:14
это много или Мало?
Мне прост нужен отчет по найденным и потерянным клиентам.
Найденные - те у кого первая сделка в периоде отчета,
потерянные - те у кого крайняя сделка далее чем 4 месяца
а возобновленные - те у кого за 4 месяца до периода отчета сделок не было
27 73
 
12.03.09
12:14
(25) Предполагаю, что (19) будет выполняться в сотни раз медленнее чем (17)
28 ottto
 
12.03.09
12:16
(23) нужно значить помещать документы во временную тыблицу и индексировать по полю контрагент и дата и использовать эту временную таблицу.
у меня проблем нет поскольку есть индекс по полю "Контрагент" у документа
29 73
 
12.03.09
12:16
(27)+ я висю уже 25 минут на 2500 контрагентах.
30 ottto
 
12.03.09
12:25
(29) сории не внимательно писал текст запроса. - так должно быть быстрее:

ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   Сделка.Ссылка КАК Договор
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.Сделка  КАК Сделка
       ПО (Сделка.Контрагент = Контрагенты.Ссылка)
           И (Сделка.Ссылка В
               (ВЫБРАТЬ ПЕРВЫЕ 3
                   СделкаК.Ссылка
               ИЗ
                   Документ.Сделка КАК СделкаК
               ГДЕ
                   СделкаК.Контрагент = Контрагенты.Ссылка
               УПОРЯДОЧИТЬ ПО
                   Сделка.Дата УБЫВ))
ИТОГИ ПО
   Контрагент
31 73
 
12.03.09
12:26
(30) Ага, попробую, когда(если) дождусь... :)
32 ottto
 
12.03.09
12:30
убей процесс.  Тут виноват оптимизатор у меня на sql время выполнения существенно не различается, на файловом 1-й запрос ну очень долго я - не дождался окончания
33 Ksandr
 
12.03.09
12:34
Неоднозначное поле Сделка.Контрагент
34 Ksandr
 
12.03.09
12:36
А что подразумевается под Документ.Сделка КАК Сделка
и что под Документ.Сделка КАК СделкаК ?
35 ottto
 
12.03.09
12:39
поскольку я кидал в свей базе - у меня есть документ Договор.


ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   Сделка.Ссылка КАК Договор
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.УС_Договор КАК Сделка
       ПО (Сделка.Контрагент = Контрагенты.Ссылка)
           И (Сделка.Ссылка В
               (ВЫБРАТЬ ПЕРВЫЕ 3
                   СделкаК.Ссылка
               ИЗ
                   Документ.УС_Договор КАК СделкаК
               ГДЕ
                   СделкаК.Контрагент = Контрагенты.Ссылка
               УПОРЯДОЧИТЬ ПО
                   Сделка.Дата УБЫВ))
ИТОГИ ПО
   Контрагент

СделкаК это псевдоним таблицы в условии, сделка - это псевдоним таблицы
36 73
 
12.03.09
12:45
(35) Перед итогами во вложенном СделкаК.Дата наверное.
37 ottto
 
12.03.09
12:46
да :)
38 73
 
12.03.09
12:48
Ну что, (30) - терпимо. ~ 10 секунд.  Ksandr, если хочешь, поправь вложенный для себя и пользуй.

Хотя мой все равно быстрее :)
И предпоследние могу сделать :)
39 ottto
 
12.03.09
12:52
Автору типа такого нужно:
первый документ + 2 последних:

ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   Сделка.Ссылка КАК Договор
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.УС_Договор КАК Сделка
       ПО (Сделка.Контрагент = Контрагенты.Ссылка)
           И (Сделка.Ссылка В
               (ВЫБРАТЬ ПЕРВЫЕ 1
                   СделкаК.Ссылка
               ИЗ
                   Документ.УС_Договор КАК СделкаК
               ГДЕ
                   СделкаК.Контрагент = Контрагенты.Ссылка
               УПОРЯДОЧИТЬ ПО
                   СделкаК.Дата))
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
   Контрагенты.Ссылка КАК Контрагент,
   Сделка.Ссылка КАК Договор
ИЗ
   Справочник.Контрагенты КАК Контрагенты
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.УС_Договор КАК Сделка
       ПО (Сделка.Контрагент = Контрагенты.Ссылка)
           И (Сделка.Ссылка В
               (ВЫБРАТЬ ПЕРВЫЕ 2
                   СделкаК.Ссылка
               ИЗ
                   Документ.УС_Договор КАК СделкаК
               ГДЕ
                   СделкаК.Контрагент = Контрагенты.Ссылка
               УПОРЯДОЧИТЬ ПО
                   СделкаК.Дата УБЫВ))

ИТОГИ ПО
   Контрагент
40 Ksandr
 
12.03.09
13:02
Не могли бы Вы пояснить УС_Договор - это что?
41 Ksandr
 
12.03.09
13:03
Когда я пишу вместо УС_Договор РеализацияТоваровУслуг выдает ошибку "неоднозначное поле"
42 73
 
12.03.09
13:05
(40) Ну у человека ведь своя база, свои документы. Туда свой пиши.
43 73
 
12.03.09
13:06
(41) Возможно у тебя в Доке есть реквизит Сделка. Измени в запросе псевдоним таблицы: КАК тратата
44 Ksandr
 
12.03.09
13:10
(43) Спасибо, сейчас попробую
45 Ksandr
 
17.03.09
15:05
Запрос обернулся в
Ошибка СУБД:
Microsoft OLE DB Provider for SQL Server: ORDER BY items must appear in the select list if the statement contains a UNION operator
HRESULT=80040E14, SQLSrvr: Error state=1, Severity=F, native=104, line=1
Выдавать глобальные идеи — это удовольствие; искать сволочные маленькие ошибки — вот настоящая работа. Фредерик Брукс-младший