![]() |
![]() |
![]() |
|
Помогите составить запрос | ☑ | ||
---|---|---|---|---|
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
|
+(15) И еще вот эту можно:
v8: Как найти максимально число по одному из параметров |
|||
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 |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |