|
Помогите с запросом | ☑ | ||
---|---|---|---|---|
0
newbas
17.05.13
✎
15:39
|
Реальную задачу долго объяснять - возьмем пример:
Нужно вывести таблицу с 2 колонками: - клиент - датой последней реализации На SQL я бы написал так: SELECT Спр.Ссылка AS Контрагент ,(SELECT TOP 1 Док.ДатаFROM Документ.РеализацияТоОваровУслуг AS Док WHERE Док.Контрагент = Спр.Ссылка) AS Дата FROM Справочник.Контрагенты AS Спр ВОПРОС: А как будет выглядеть аналог на языке запросов 1С? |
|||
1
Renat11111
17.05.13
✎
15:41
|
МАКСИМУМ используй
|
|||
2
vvp91
17.05.13
✎
15:42
|
(1) Твой запрос ошибочен, он вернет дату случайной реализации, а не дату последней, ты забыл упорядочить.
В 1С коррелированных подзапросов нет. Перепиши свой запрос на соединение контрагентов и реализаций и получишь то, что будет в 1С. |
|||
3
Ёпрст
17.05.13
✎
15:42
|
в 7-ке аналогисно, в 8-ке
левое соединение + максимум по дате дока |
|||
4
newbas
17.05.13
✎
15:42
|
(2) Согласен, забыл про ORDER BY Док.Дата DESC
|
|||
5
newbas
17.05.13
✎
15:43
|
(3) Лучшая документация для программиста - ИСХОДНИК!
Можно пример |
|||
6
palpetrovich
17.05.13
✎
15:46
|
выбрать док.контрагент, МАКСИМУМ(док.Дата) из...
|
|||
7
newbas
17.05.13
✎
15:47
|
ВЫБРАТЬ
Спр.Ссылка AS Контрагент ИЗ Справочник.Контрагенты AS Спр ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Док.Контрагент, MAX(Док.Дата) ИЗ Документ.РеализацияТоОваровУслуг AS Док ) КАК Доки ПО Доки.Контрагент = Спр.Ссылка Все верно? |
|||
8
User_Agronom
17.05.13
✎
15:48
|
СГруппировать?
|
|||
9
newbas
17.05.13
✎
15:48
|
Спр.Ссылка КАК Контрагент
,Доки.Дата ИЗ Справочник.Контрагенты КАК Спр ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Док.Контрагент, MAX(Док.Дата) КАК Дата ИЗ Документ.РеализацияТоваровУслуг КАК Док ) КАК Доки ПО Доки.Контрагент = Спр.Ссылка |
|||
10
newbas
17.05.13
✎
15:49
|
ВЫБРАТЬ
Спр.Ссылка КАК Контрагент ,Доки.Дата ИЗ Справочник.Контрагенты КАК Спр ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Док.Контрагент, MAX(Док.Дата) КАК Дата ИЗ Документ.РеализацияТоОваровУслуг КАК Док СГРУППИРОВАТЬ ПО Док.Контрагент ) КАК Доки ПО Доки.Контрагент = Спр.Ссылка |
|||
11
mr_K
17.05.13
✎
15:50
|
(9) А две таблицы зачем? Не проще ли сразу брать контрагента из документа?
|
|||
12
newbas
17.05.13
✎
15:50
|
(9) А если не было отгрузки у контрагента?
|
|||
13
palpetrovich
17.05.13
✎
15:52
|
(12) а в (0) про это ничего нет :)
|
|||
14
newbas
17.05.13
✎
15:53
|
А если усложнить задание и вывести еще сумму этой последней накладной?
|
|||
15
User_Agronom
17.05.13
✎
15:53
|
ВЫБРАТЬ
Контрагенты.Ссылка, Док.Дата1 ИЗ Справочник.Контрагенты КАК Контрагенты ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(РеализацияТоваровУслуг.Дата) КАК Дата1, РеализацияТоваровУслуг.Контрагент КАК Контрагент ИЗ Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг СГРУППИРОВАТЬ ПО РеализацияТоваровУслуг.Контрагент) КАК Док ПО (Док.Контрагент = Контрагенты.Ссылка) |
|||
16
User_Agronom
17.05.13
✎
15:54
|
(11) Проще. Но тут соединения ради соединения))
|
|||
17
User_Agronom
17.05.13
✎
15:55
|
(14) Тогда точно упростить и по одной таблице шариться))
|
|||
18
newbas
17.05.13
✎
15:56
|
(15) так не пойдет, т.к. группировка в основной выборке не нужна. Я первый запрос привел для того, чтобы показать, что нужно поле, получаемое подзапросом
|
|||
19
newbas
17.05.13
✎
15:58
|
(17) Хорошо. Еще более конкретизируем задачу.
Нужно вывести: -Контрагента (Всегда) -Сумма продаж за период (нет проблем) -Дату и сумму последней отгрузки -контактная информация и т.д. |
|||
20
User_Agronom
17.05.13
✎
15:58
|
(18) Тебе нужно выбрать поле с максимальной датой. А как выбирать, из какой группы? Вот я и показал, что нужно поле с макс датой но группы делать по контрагенту
|
|||
21
User_Agronom
17.05.13
✎
15:59
|
И у меня второе поле получаемо подзапросом
|
|||
22
newbas
17.05.13
✎
16:00
|
(20) согласен, я в (10) написал так, как меня устроит.
Вопрос темы был в том, чем заменить поля-подзапросы? |
|||
23
User_Agronom
17.05.13
✎
16:01
|
Пакетный запрос.
ПОМЕСТИТЬ |
|||
24
User_Agronom
17.05.13
✎
16:02
|
Но от соединения можно уйти только по (11)
|
|||
25
StanislawJack
17.05.13
✎
16:03
|
(19) Сначала в подзапросе получаешь максимальную дату, потом соединяешь результат опять с документами, только по контрагенту и полученной дате с ПЕРВЫЕ 1
|
|||
26
newbas
17.05.13
✎
16:12
|
(25) ПЕРВЫЕ 1 - выборка только одного документа, а мне надо для всех контрагентов.
|
|||
27
User_Agronom
17.05.13
✎
16:19
|
Подзапросы мутить лениво как-то((
|
|||
28
newbas
17.05.13
✎
16:19
|
(27) а выход какой?
|
|||
29
User_Agronom
17.05.13
✎
16:21
|
Сейчас напишу. Минут через 10
|
|||
30
User_Agronom
17.05.13
✎
16:37
|
ВЫБРАТЬ
ТолпаКонтагентов.Ссылка, Док.Дата1 КАК ДатаДокумента, ДанныеДока.СуммаДокумента ИЗ Справочник.Контрагенты КАК ТолпаКонтагентов ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(РТУслуг.Дата) КАК Дата1, РТУслуг.Контрагент КАК Контрагент ИЗ Документ.РеализацияТоваровУслуг КАК РТУслуг СГРУППИРОВАТЬ ПО РТУслуг.Контрагент) КАК Док ПО ТолпаКонтагентов.Ссылка = Док.Контрагент ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Докс.Контрагент КАК Контрагент, Докс.Дата КАК Дата, Докс.СуммаДокумента КАК СуммаДокумента ИЗ Документ.РеализацияТоваровУслуг КАК Докс) КАК ДанныеДока ПО (ДанныеДока.Дата = Док.Дата1) И ТолпаКонтагентов.Ссылка = ДанныеДока.Контрагент |
|||
31
User_Agronom
17.05.13
✎
16:38
|
как-то так. Не тестил еще. Но вроде некогда.
|
|||
32
viktor_vv
17.05.13
✎
16:43
|
Вот еще вариант, правда может тормозить, но думаю не медленне коррелированного подзапроса в селекте.
| Выбрать | СпрКонтр.Ссылка КАК Контрагент, | РеализацияТоваровУслуг.Ссылка КАК ДокПродажи, | РеализацияТоваровУслуг.Дата КАК ДатаДок | | ИЗ | Справочник.Контрагенты КАК СпрКонтр | Левое соединение Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | | ПО РеализацияТоваровУслуг.Контрагент = СпрКонтр.Ссылка | И РеализацияТоваровУслуг.Ссылка В (Выбрать Первые 1 | РеализацияТоваровУслуг2.Ссылка | | ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг2 | Где РеализацияТоваровУслуг2.Контрагент = СпрКонтр.Ссылка | Упорядочить ПО РеализацияТоваровУслуг2.Дата УБЫВ, РеализацияТоваровУслуг2.Ссылка УБЫВ | ) |"; |
|||
33
viktor_vv
17.05.13
✎
16:45
|
Есть таки вариант с временной таблицей или подзапросом как выше, но вкурть никак не могу с условием соедиенния, на случай если в одной секунде несколько доков.
|
|||
34
User_Agronom
17.05.13
✎
16:49
|
ВЫБРАТЬ
ТолпаКонтагентов.Ссылка, Док.Дата1 КАК ДатаДокумента, ДанныеДока.СуммаДокумента ИЗ Справочник.Контрагенты КАК ТолпаКонтагентов ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ МАКСИМУМ(РТУслуг.Дата) КАК Дата1, РТУслуг.Контрагент КАК Контрагент ИЗ Документ.РеализацияТоваровУслуг КАК РТУслуг СГРУППИРОВАТЬ ПО РТУслуг.Контрагент) КАК Док ПО ТолпаКонтагентов.Ссылка = Док.Контрагент ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ Докс.Контрагент КАК Контрагент, Докс.Дата КАК Дата, Докс.СуммаДокумента КАК СуммаДокумента ИЗ Документ.РеализацияТоваровУслуг КАК Докс) КАК ДанныеДока ПО (ДанныеДока.Дата = Док.Дата1) И ТолпаКонтагентов.Ссылка = ДанныеДока.Контрагент ГДЕ НЕ ДанныеДока.СуммаДокумента ЕСТЬ NULL Вот так в итоге. (33) Ну да. Это я не учел |
|||
35
sttt
17.05.13
✎
17:01
|
||||
36
newbas
17.05.13
✎
17:07
|
(34) спасибо - ощущения извращения никак не проходят. Что мешало 1С сделать поля-подзапросы?
|
|||
37
StanislawJack
17.05.13
✎
17:44
|
(33) Если в секунде несколько документов, надо выбрать МАКСИМУМ для Документ.Ссылка, в результате будет получен документ, GUID которого был создан самым последним из находящихся в этой секунде.
|
|||
38
viktor_vv
17.05.13
✎
17:59
|
(37) А, получается к подзапросу по максимальной дате цепляем еще раз таблицу дока по контру и дате и отсюда уже берем максимальную ссылку группируя опять по контрагенту.
|
|||
39
kiruha
17.05.13
✎
18:21
|
(36)
Потому что коррелированные подзапросы грузят базу не по детски А ежели последняя реализация была 2001 г и индекса по клиенту в реализации нету ? Если Вам нужна дата последней реализации(или обращения клиента более точно) - в 1С заводят регистр сведений и там хранят |
|||
40
viktor_vv
17.05.13
✎
18:23
|
(38)+ Получилась такая хрень, вроде работает, но как-то тоже красотой не блещет
ТекстЗапроса = " |Выбрать | РеализацияТоваровУслуг.Контрагент КАК Контрагент, | Максимум(РеализацияТоваровУслуг.Ссылка) КАК СсылкаДок |Поместить ПоследниеДокументы |ИЗ | (ВЫБРАТЬ | РеализацияТоваровУслуг.Контрагент КАК Контрагент, | Максимум(РеализацияТоваровУслуг.Дата) КАК ДатаДок | ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | Сгруппировать ПО | РеализацияТоваровУслуг.Контрагент | ) КАК ПодзапросПоДате | Внутреннее соединение | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО ПодзапросПоДате.Контрагент = РеализацияТоваровУслуг.Контрагент | И ПодзапросПоДате.ДатаДок = РеализацияТоваровУслуг.Дата |Сгруппировать ПО | РеализацияТоваровУслуг.Контрагент | |; |Выбрать | СпрКонтр.Ссылка КАК Контрагент, | РеализацияТоваровУслуг.Ссылка КАК ДокПродажи, | РеализацияТоваровУслуг.Дата КАК ДатаДок |ИЗ | Справочник.Контрагенты КАК СпрКонтр | Левое соединение ПоследниеДокументы КАК ПоследниеДокументы | ПО ПоследниеДокументы.Контрагент = СпрКонтр.Ссылка | Левое соединение Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО ПоследниеДокументы.СсылкаДок = РеализацияТоваровУслуг.Ссылка |"; |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |