Имя: Пароль:
1C
1С v8
Помогите разобраться с запросом
0 mk-61
 
07.10.13
12:42
Добрый день!
Осваиваю запросы на 8.2 и никак не могу разобраться с одной проблемкой. Итак, есть запрос:

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

В итоге получается такая табличка:
№      Ссылка                    Касса         СуммаДокумента
1 РН НФ00-000003 от 19.09.2013     Основная касса    579
2 РН НФ00-000003 от 19.09.2013     Приватбанк    1121
3 РН ДН00-000054 от 21.09.2013     Основная касса    4 020
4 РН НФ00-000004 от 20.09.2013     NULL    NULL
5 РН ДН00-000055 от 21.09.2013     Основная касса    32
6 РН ДН00-000055 от 21.09.2013     Аваль            132
7 РН ДН00-000039 от 20.09.2013     NULL    NULL
8 РН ДН00-000009 от 17.09.2013     Основная касса    40
9 РН ДН00-000056 от 21.09.2013     Основная касса    250

Мне надо получить таблицу, чтобы в итоге по одной и той же накладной отбиралась Касса с максимальной суммой. Т.е. после выполнения запроса должны отсеяться строки 1 и 5.

№      Ссылка                    Касса         СуммаДокумента
2 РН НФ00-000003 от 19.09.2013     Приватбанк    1121
3 РН ДН00-000054 от 21.09.2013     Основная касса    4 020
4 РН НФ00-000004 от 20.09.2013     NULL    NULL
6 РН ДН00-000055 от 21.09.2013     Аваль            132
7 РН ДН00-000039 от 20.09.2013     NULL    NULL
8 РН ДН00-000009 от 17.09.2013     Основная касса    40
9 РН ДН00-000056 от 21.09.2013     Основная касса    250

Подскажите, как доработать запрос, чтобы получить то, что я хочу ;)
Надеюсь, выразился доступно для понимания. Спасибо.
1 Rovan
 
гуру
07.10.13
12:45
ВЫБРАТЬ
   ТаблРН.Ссылка,
   ПоступлениеВКассу.Касса,
   СУММА(ПоступлениеВКассу.СуммаДокумента)
ПОМЕСТИТ ВТ_ВСЕ
ИЗ
   ТаблРН КАК ТаблРН
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеВКассу КАК ПоступлениеВКассу
       ПО (ТаблРН.Ссылка = ПоступлениеВКассу.ДокументОснование
               ИЛИ ТаблРН.Заказ = ПоступлениеВКассу.ДокументОснование)
СГРУППИРОВАТЬ ПО
    ТаблРН.Ссылка,
    ПоступлениеВКассу.Касса
;

ВЫБРАТЬ
   все.Касса,
   МАКСИМУМ(все.СуммаДокумента)
ИЗ
ВТ_ВСЕ как все
2 mk-61
 
07.10.13
14:58
(1)
В Вашем варианте "Поле не входит в группу - Касса". Если сгруппирую, то вообще не то, что надо.
3 Euguln
 
07.10.13
15:04
(2) Покурить агрегатные функции в запросе не предлагать?
4 mk-61
 
07.10.13
15:04
(3) Курил - не помогает. ;)
5 Euguln
 
07.10.13
15:06
(4) Не заметно, где в запросе использование функции МАКСИМУМ?
6 mk-61
 
07.10.13
15:06
(3) Предложите хотя бы какую курить. Может не тем интересовался.
7 mk-61
 
07.10.13
15:08
(5) В запросе (1) МАКСИМУМ есть. Я такой вариант пробовал и до того.
8 mk-61
 
07.10.13
15:09
Вот вариант, предложенный в (1)

ВЫБРАТЬ
   ВТ_Все.Касса,
   МАКСИМУМ(Сумма)
ИЗ
  Вт_Все КАК Все

Но тогда требует группировку. После группировки вообще не то, что надо получается
9 Euguln
 
07.10.13
15:12
(8) а применить к запросу в (0) вместо СУММА МАКСИМУМ не пробовал?
10 viktor_vv
 
07.10.13
15:19
ВЫБРАТЬ
   ТаблРН.Ссылка КАК Ссылка,
   ПоступлениеВКассу.Касса КАК Касса,
   СУММА(ПоступлениеВКассу.СуммаДокумента) КАК СуммаПост
Поместить
   ВТПоступления
ИЗ
   ТаблРН КАК ТаблРН
       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеВКассу КАК ПоступлениеВКассу
       ПО (ТаблРН.Ссылка = ПоступлениеВКассу.ДокументОснование
               ИЛИ ТаблРН.Заказ = ПоступлениеВКассу.ДокументОснование)
СГРУППИРОВАТЬ ПО
    ТаблРН.Ссылка,
    ПоступлениеВКассу.Касса
;////////////
ВЫБРАТЬ
   Ссылка КАК Ссылка,
  Касса,
   МаксСумма

ИЗ
   ВТПоступления КАК ВТПоступления
Где
  (Ссылка,Касса) В (
            Выбрать Первые 1
              ВТПоступления2.Ссылка
              ИЗ
                ВТПоступления2 КАК ВТПоступления2
             ГДЕ
                 ВТПоступления2.Ссылка = ВТПоступления.Ссылка
             Сортировать по ВТПоступления2.СуммаМакс Убыв ,  ВТПоступления2.Касса )

Тормозной правда может быть, там еще одну временную надо, чтоб быстрее было, лениво писать.
11 viktor_vv
 
07.10.13
15:20
(10)+ В псоледнем запросе

   МаксСумма ->> СуммаПост
12 viktor_vv
 
07.10.13
15:22
(10)+ И вместо

           Выбрать Первые 1
              ВТПоступления2.Ссылка

писать

           Выбрать Первые 1
              ВТПоступления2.Ссылка,
              ВТПоступления2.Касса
13 mk-61
 
07.10.13
15:23
(9) Если заменить сумму на максимум, то результат не верный. Так как в итоге получу максимальный результат по счету "Касса" и максимальный по "Приватбанк". Мне надо только один из двух. С указанием по какому счету этот максимум достигнут.
14 Euguln
 
07.10.13
15:26
(13) не понял. Результат такого запроса покажи
15 mk-61
 
07.10.13
15:30
(14) первая табличка в (0), фактически, и есть результат такого запроса
16 viktor_vv
 
07.10.13
15:33
(13) Не мучайся, не получится просто через максимум то, что тебе надо.
17 mk-61
 
07.10.13
15:34
(16)я это уже давно понял. сейчас будут с твоим вариантом разбираться. спасибо.
18 viktor_vv
 
07.10.13
15:38
(17) (10) Это по мотивам

http://kb.mista.ru/article.php?id=92
19 mk-61
 
07.10.13
15:38
(10) ВТПоступления2 - это какая таблица?
20 viktor_vv
 
07.10.13
15:40
(19) Упс. Та же самая .

              ИЗ
                ВТПоступления КАК ВТПоступления2
21 Euguln
 
07.10.13
16:01
ВЫБРАТЬ РАЗЛИЧНЫЕ не пробовал?
22 viktor_vv
 
07.10.13
17:23
Вот вариант через соединения

    ТекстЗапроса = "
|ВЫБРАТЬ
|   ТаблРН.Ссылка КАК Ссылка,
|   ПоступлениеВКассу.Касса КАК Касса,
|   СУММА(ПоступлениеВКассу.СуммаДокумента) КАК СуммаПост
|Поместить
|   ВТПоступления
|ИЗ
|   ТаблРН КАК ТаблРН
|       ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеВКассу КАК ПоступлениеВКассу
|       ПО (ТаблРН.Ссылка = ПоступлениеВКассу.ДокументОснование
|               ИЛИ ТаблРН.Заказ = ПоступлениеВКассу.ДокументОснование)
|СГРУППИРОВАТЬ ПО
|    ТаблРН.Ссылка,
|    ПоступлениеВКассу.Касса
|;////////////
|ВЫБРАТЬ
|   Ссылка КАК Ссылка,
|   Максимум(СуммаПост) КАК МаксСумма
|Поместить
|    ВТМаксСумма
|ИЗ
|   ВТПоступления КАК ВТПоступления
|Сгурппировать ПО
|    Ссылка
|;
|/////////
|ВЫБРАТЬ
|   Ссылка КАК Ссылка,
|   Касса,
|   СуммаПост
|
|ИЗ
|   ВТПоступления КАК ВТПоступления
|    Внутренне соединение (
|        // на случай если по двум разным кассам одинаковые суммы по одной накладной прошли
|        // возьмем еще максимум по кассе, чтобы выбрать одну какую-то (в данном случае с максимальной ссылкой)
|                        Выбрать
|                            ВТПоступления2.Ссылка КАК Ссылка,
|                            ВТПоступления2.СуммаПост КАК СуммаПост,
|                            Максимум(ВТПоступления2.Касса) КАК Касса,
|                        ИЗ
|                            ВТПоступления КАК ВТПоступления2
|                            Внутреннее соединение ВТМаксСумма КАК ВТМаксСумма
|                                ПО ВТМаксСумма.МаксСумма = ВТПоступления2.СуммаПост И ВТМаксСумма.Ссылка = ВТПоступления2.Ссылка
|                        Сгруппировать ПО
|                            ВТПоступления2.Ссылка , ВТПоступления2.СуммаПост
|                        ) КАК СвернутоПоСумме
|    ПО СвернутоПоСумме.Ссылка = ВТПоступления.Ссылка И СвернутоПоСумме.Касса = ВТПоступления.Касса
|";
23 mk-61
 
07.10.13
18:02
(22) О! Похоже, то что надо. Спасибо.

ЗЫ: Блин, а я по своей наивности все пытался агрегатными функциями в три строки это реализовать...
24 viktor_vv
 
07.10.13
18:22
(23) В (10) то же самое, разве что немного сложнее въехать.
25 viktor_vv
 
07.10.13
19:08
Ну и в (22) Переборщил с соединениями. Там в подзапросе уже то, что тебе надо. Так что последний запос пакета такой.

|                        Выбрать
|                            ВТПоступления.Ссылка КАК Ссылка,
|                            ВТПоступления.СуммаПост КАК СуммаПост,
|                            Максимум(ВТПоступления.Касса) КАК Касса,
|                        ИЗ
|                            ВТПоступления КАК ВТПоступления
|                            Внутреннее соединение ВТМаксСумма КАК ВТМаксСумма
|                                ПО ВТМаксСумма.МаксСумма = ВТПоступления.СуммаПост И ВТМаксСумма.Ссылка = ВТПоступления.Ссылка
|                        Сгруппировать ПО
|                            ВТПоступления.Ссылка , ВТПоступления.СуммаПост
26 mk-61
 
07.10.13
19:39
(25) Сенкс еще раз ;)
Оптимист верит, что мы живем в лучшем из миров. Пессимист боится, что так оно и есть.