|   |   | 
| 
 | Помогите с запросом | ☑ | ||
|---|---|---|---|---|
| 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)+ Получилась такая хрень, вроде работает, но как-то тоже красотой не блещет
  ТекстЗапроса = " |Выбрать | РеализацияТоваровУслуг.Контрагент КАК Контрагент, | Максимум(РеализацияТоваровУслуг.Ссылка) КАК СсылкаДок |Поместить ПоследниеДокументы |ИЗ | (ВЫБРАТЬ | РеализацияТоваровУслуг.Контрагент КАК Контрагент, | Максимум(РеализацияТоваровУслуг.Дата) КАК ДатаДок | ИЗ | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | Сгруппировать ПО | РеализацияТоваровУслуг.Контрагент | ) КАК ПодзапросПоДате | Внутреннее соединение | Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО ПодзапросПоДате.Контрагент = РеализацияТоваровУслуг.Контрагент | И ПодзапросПоДате.ДатаДок = РеализацияТоваровУслуг.Дата |Сгруппировать ПО | РеализацияТоваровУслуг.Контрагент | |; |Выбрать | СпрКонтр.Ссылка КАК Контрагент, | РеализацияТоваровУслуг.Ссылка КАК ДокПродажи, | РеализацияТоваровУслуг.Дата КАК ДатаДок |ИЗ | Справочник.Контрагенты КАК СпрКонтр | Левое соединение ПоследниеДокументы КАК ПоследниеДокументы | ПО ПоследниеДокументы.Контрагент = СпрКонтр.Ссылка | Левое соединение Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг | ПО ПоследниеДокументы.СсылкаДок = РеализацияТоваровУслуг.Ссылка |"; | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |