Как в запросе 1с найти максимальное значение

Автор уроков и преподаватель школы: Владимир Милькин

Группировка в запросах

Давайте запросим из таблицы Справочник.Еда следующие реквизиты: Наименование, Цвет и Калорийность:

ВЫБРАТЬ
	Наименование,
	Цвет,
	Калорийность
ИЗ
	Справочник.Еда

01

У вас другой порядок строк в результате?

Теперь предположим, что нам необходимо вычислить суммарную калорийность продуктов для каждого цвета.

Алгоритм для жёлтого цвета будет такой:

  1. Находим все строчки у которых в поле Цвет стоит Жёлтый.
  2. Это будут строчки №1, 6, 8 и 9.
  3. Суммируем поле Калорийность для каждой из этих строк: 89 + 31 + 340 + 536
  4. Получаем, что для жёлтого цвета суммарная калорийность равна 996.

И так для каждого цвета.

Описанный выше процесс называется группировкой. Таким образом, группировка — это «схлопывание» (свёртка) строчек таблицы по определенному признаку.

При группировке все поля делятся на две группы:

  • Группировочные — это как раз те поля, по которым идёт свёртка. В нашем случае таким полем является Цвет.
  • Группируемые — это те поля, которые сворачиваются (схлопываются, объединяются). В нашем случае таким полем является Калорийность.

01

Группируемые поля не могут быть сами по себе. К ним обязательно применяется одна из агрегатных функций: СУММА, СРЕДНЕЕ, МИНИМУМ, МАКСИМУМ, КОЛИЧЕСТВО, КОЛИЧЕСТВО РАЗЛИЧНЫЕ:

02

Агрегатная функция СУММА

Это как раз случай, который мы разбирали. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Все строки группируются по группировочным полям (Цвет), а группируемые поля (Калорийностьсуммируются:

ВЫБРАТЬ
	Цвет,
	СУММА(Калорийность)
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
	Цвет

сумма

У вас другой порядок строк в результате?

Агрегатная функция СРЕДНЕЕ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится среднее значение:

ВЫБРАТЬ
	Цвет,
	СРЕДНЕЕ(Калорийность)
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
	Цвет

среднее

У вас другой порядок строк в результате?

Агрегатная функция МИНИМУМ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится минимальное значение:

ВЫБРАТЬ
	Цвет,
	МИНИМУМ(Калорийность)
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
	Цвет

минимум

У вас другой порядок строк в результате?

Агрегатная функция МАКСИМУМ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится максимальное значение:

ВЫБРАТЬ
	Цвет,
	МАКСИМУМ(Калорийность)
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
	Цвет

максимум

У вас другой порядок строк в результате?

Агрегатная функция КОЛИЧЕСТВО

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится их количество:

ВЫБРАТЬ
	Цвет,
	КОЛИЧЕСТВО(Калорийность)
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
	Цвет

количество

У вас другой порядок строк в результате?

Агрегатная функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ

В этом случае все строки группируются по группировочным полям (Цвет), а среди группируемых полей (Калорийность) находится количество элементов с различными значениями:

ВЫБРАТЬ
	Цвет,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Калорийность)
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
	Цвет

количество различные

У вас другой порядок строк в результате?

Функция КОЛИЧЕСТВО РАЗЛИЧНЫЕ требует пояснения, потому что на выбранном примере её результат совпадает с функцией КОЛИЧЕСТВО. Вы читаете ознакомительную версию урока, полноценные уроки находятся здесь. Вот более показательный пример, который всё объясняет:

03

Группировка без группируемых полей и агрегатных функций

Использование агрегатных функций в запросе не требуется, если результатом запроса будут только группировочные поля:

06

К примеру, сделаем выборку всех вкусов, которые встречаются среди еды:

ВЫБРАТЬ
	Вкус
ИЗ
	Справочник.Еда

07 

У вас другой порядок строк в результате?

Как видите вкусы повторяются — давайте их сгруппируем:

ВЫБРАТЬ
	Вкус
ИЗ
	Справочник.Еда
СГРУППИРОВАТЬ ПО
    Вкус

08 

У вас другой порядок строк в результате?

Таким образом, мы сделали группировку только по группировочным полям (Вкус). Группируемые поля, а следовательно и агрегатные функции нам не понадобились.

Группировка без группировочных полей

Соответственно использование группировочных полей также не требуется, если результатом запроса будут только группируемые поля:

12

К примеру, получим результаты агрегатных функций применительно к полю Калорийность без группировочных полей (то есть по всей таблице):

ВЫБРАТЬ
	СУММА(Калорийность) КАК Сумма,
	СРЕДНЕЕ(Калорийность) КАК Среднее,
	МИНИМУМ(Калорийность) КАК Минимум,
	МАКСИМУМ(Калорийность) КАК Максимум,
	КОЛИЧЕСТВО(Калорийность) КАК Количество	
ИЗ
	Справочник.Еда

13

Группировка по нескольким полям

Группировочных (как впрочем и группируемых) полей может быть сколь угодно много. В запросе они перечисляются через запятую.

Пройдите тест

В языке запросов 1С:Предприятие 8 предусмотрено использование агрегатных функций. Эти функции необходимы, в случаях когда нам нужно вычислить какое-то одиночное значение из набора значений. К примеру, у нас есть некоторый набор чисел (3, 1, 4, 5), с помощью агрегатных функций мы можем их просуммировать, получив число 13, или вычислить минимум — число 1. Все из них имеют аналогичный синтаксис и используются похожим образом.

Сумма

СУММА(ИмяПоля) – суммирует значения колонки (поля). Следует помнить, что суммировать можно только числовые поля. Если поле имеет составной тип данных, содержит не только числовые значения, то функция может быть применена, но в случае появления в выборке нечислового поля, выполнение запроса закончится с ошибкой.

Пример, вычислим общее количество товаров находящееся во всех документах «Поступление товаров и услуг»:

ВЫБРАТЬ 
   СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ОбщееКоличествоТоваров,

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

Минимум

МИНИМУМ(ИмяПоля) – вычисляет минимальное значение колонки (поля).

Максимум

МАКСИМУМ(ИмяПоля) – вычисляет максимальное значение колонки (поля).

Среднее

СРЕДНЕЕ(ИмяПоля) – вычисляет среднее значение колонки (поля).

Следует помнить, что у каждого типа данных есть свои правила сравнения. Подробнее можно прочитать в статье о правилах сравнения значений. 

Количество

КОЛИЧЕСТВО(ИмяПоля) – подсчитывает количество значений колонки

КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ИмяПоля) — подсчитывает количество уникальных значений колонки

Примеры

Если в выборке присутствуют только поля к которым применяется агрегатная функция, то применение выглядит следующим образом:

ВЫБРАТЬ 
   
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.Номенклатура) КАК КоличествоРазличныхНоменклатур,
   
СУММА(ПоступлениеТоваровУслугТовары.Количество) КАК ОбщееКоличествоТоваров,
   МИНИМУМ(ПоступлениеТоваровУслугТовары.Сумма) КАК МинимальнаяСуммаПокупки

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

Если в выборке пристутствуют поля не использующие агрегатные функции, они обязательно должны быть указаны в секции СГРУППИРОВАТЬ ПО: 

ВЫБРАТЬ 
   ПоступлениеТоваровУслугТовары.Номенклатура
,

   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ПоступлениеТоваровУслугТовары.ЕдиницаИзмерения)

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК ПоступлениеТоваровУслугТовары

СГРУППИРОВАТЬ ПО

    ПоступлениеТоваровУслугТовары.Номенклатура 

В таком случае поля указанные в секции СГРУППИРОВАТЬ будут использованы в качестве разрезов группировки. И значения агрегатных функций будут рассчитаны в разрезе этих группировок. 

К примеру есть следущий набор данных:

Номенклатура Количество
Яблоко 1
Яблоко 3
Апельсин 2
Апельсин 4

Мы используем агрегатную функцию Сумма на колонке «Количество», чтобы вычислить общее количество товаров

 ВЫБРАТЬ

    ТаблицаТоваров.Номенклатура,

    СУММА(ТаблицаТоваров.Количество) КАК Количество

ИЗ

    ТаблицаТоваров КАК ТаблицаТоваров

СГРУППИРОВАТЬ ПО

    ТаблицаТоваров.Номенклатура 

Так как поле «Номенклатура» так же присутствует в полях выборки мы обязаны указать его в секции группировки. 
В результате мы получим следующий набор данных:

Номенклатура Количество
Яблоко 4
Апельсин 6

Повторяющиеся значения номенклатуры превратились в одну, а их количества просуммировались. 

В случае если же мы хотим узнать общее количество номенклатуры для всего набора данных, мы можем использовать секцию «Итоги». Подробнее читайте в соотвествующей статье Секция запроса Итоги По.

Стоит отметить, что перечисленные функции также могут использоваться и с оператором ВЫБОР.

Пример, зададим условие на количество товаров, и определим значения поля, если условия выполняются:

ВЫБРАТЬ

    Товары.Номенклатура КАК Номенклатура,

    ВЫБОР

        КОГДА СУММА(Товары.Количество) > 5

            ТОГДА «Нормально»

        ИНАЧЕ «Слишком мало»

    КОНЕЦ КАК ОценкаПокупок

ИЗ

    Документ.ПоступлениеТоваровУслуг.Товары КАК Товары

СГРУППИРОВАТЬ ПО

    Товары.Номенклатура

Результатом может быть такая таблица: 

Номенклатура ОценкаПокупок
Апельсины Слишком мало
Яблоки Слишком мало
Клубника Слишком мало
Салфетки Нормально
Фруктовый сок Слишком мало
Фруктово-ореховая смесь Нормально

Как выбрать максимальное значение в запросе?

Я
   sapravka

02.05.14 — 23:27

Здравствуйте!

Если что то не так — прошу сильно не винить.

В УТ 10.3 делаю простой запрос — вывожу список номеров договоров в запросе:

ВЫБРАТЬ

    ДоговорыКонтрагентов.Номер КАК НомерДоговора

ИЗ

    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

И вот получаю такие результаты — вот рисунок:

http://волгалаб.рф/1c/162.jpg

Максимальный номер — 320.

А вот когда делаю вот такой запрос:

ВЫБРАТЬ ПЕРВЫЕ 1

    ДоговорыКонтрагентов.Номер КАК НомерДоговора

ИЗ

    Справочник.ДоговорыКонтрагентов КАК ДоговорыКонтрагентов

УПОРЯДОЧИТЬ ПО

    ДоговорыКонтрагентов.Номер УБЫВ

А тут получаю такие результаты, вот рисунок:

http://волгалаб.рф/1c/163.jpg

То почему то получается — 99.

Убедительно прошу, подскажите пожалуйста, как в запросе реализовать выборку последнего номера(максимального)?

   vi0

1 — 02.05.14 — 23:29

видимо это строка и «99…» действительно — максимум

   sapravka

2 — 02.05.14 — 23:35

(1) А как это может быть?

А как реализовать в запросе так, что бы (в данной примере имеется ввиду) выбиралось 320 ?

   AlteZ

3 — 02.05.14 — 23:35

извини, бро, если мимо, но разве «первые 1» не выбирает первую запись из таблицы?

почему бы не

выбрать максимум(ДоговорыКонтрагентов.Номер) ?

   EvgeniuXP

4 — 02.05.14 — 23:38

потому что «9» больше «3» — всё правильно.

   sapravka

5 — 02.05.14 — 23:52

(3) Тоже 99 показывает

Но вот почему???

   Aleksey

6 — 02.05.14 — 23:53

(5) потому что

строка 99 > чем строка 100

   Aleksey

7 — 02.05.14 — 23:54

ибо 9 > 1

   sapravka

8 — 03.05.14 — 00:01

(7) А как это может быть?

А можно как то в запросе выбирать последнюю стоку (строка — число?)?

   Torquader

9 — 03.05.14 — 00:02

(8) Пойми, наконец, разницу между строками и числами.

   Aleksey

10 — 03.05.14 — 00:03

(8) строка не число, строка это строка. И от того что она выглядит как число он не становится числом

   Torquader

11 — 03.05.14 — 00:08

(10) Просто, некоторые, когда сортируют файлы в Windows и видят чудо — верят в то, что это будет так всегда.

   sapravka

12 — 03.05.14 — 00:13

А как тогда сделать сортировку по чилу, а не по строке?

   шаэс

13 — 03.05.14 — 00:14

(11) т.е. в запросе выбрать все, преобразовать результат в число и отсортировать? или в запросе сразу преобразовать можно?

   vi0

14 — 03.05.14 — 00:14

приводи к числу

правда сам запрос неоптимальный будет, даже если проиндексируешь по номеру

   newjon

15 — 03.05.14 — 00:16

выразить (НомерДоговора как число (10)) или сколько у тебя символово в договоре

   newjon

16 — 03.05.14 — 00:17

да тут еще и сайте рекламируют

   Torquader

17 — 03.05.14 — 00:19

(13) Вам опять поговорить не с кем ?

   neo_matrix_123

18 — 03.05.14 — 00:23

(0) вот только что будет, если кому-то приспичит забить в номер договора что-то типа 01/03-07?

   шаэс

19 — 03.05.14 — 00:23

(17) мне ответ интересен.

   Torquader

20 — 03.05.14 — 00:24

(18) Исключение будет, а если преобразовать в запросе — то преобразовывать будет SQL и получит из «01/03-07» значение «1».

   sapravka

21 — 03.05.14 — 00:25

(15)  Можно немного поподробнее, как это в запросе реализовать?

(18) А как тогда быть?

   Torquader

22 — 03.05.14 — 00:26

(21) В 1С нет сортировки через внешнюю функцию — она здесь как раз кстати.

   Torquader

23 — 03.05.14 — 00:26

Хотя, как сравнить 009 и 01/03-07 ???

   neo_matrix_123

24 — 03.05.14 — 00:28

(21) предусматривать такой вариант развития событий перед записью нового договора, например. это вопрос существующих правил регистрации договоров. только на практике одними циферками не обходится, увы

   Torquader

25 — 03.05.14 — 00:32

(24) Я бы, всё-таки, сортировал бы как строки, но дописывал нули в начале.

   sapravka

26 — 03.05.14 — 00:34

А как тогда лучше сделать?

   neo_matrix_123

27 — 03.05.14 — 00:34

(25) может к началу задачки вернуться? зачем нужна сортировка по номеру договора дабы найти «крайний»?

   sapravka

28 — 03.05.14 — 00:35

(24) Да найти максимальный номер(число) с помощью запроса.

   sapravka

29 — 03.05.14 — 00:47

(28) А  пример, можно в студию?

   EvgeniuXP

30 — 03.05.14 — 01:43

(26) при записи документа записывай в реквизит число и тащи в запросе.

   sapravka

31 — 03.05.14 — 01:59

(30) а в самом запросе — это как можно реализовать?

   sapravka

32 — 03.05.14 — 02:16

Вот в запросе пытаюсь прописать:

ВЫРАЗИТЬ((ДоговорыКонтрагентов.Номер) КАК ЧИСЛО)

Но что то ругается…

   Aleksey

33 — 03.05.14 — 02:42

(28) а вот дальше будет интересно, ибо нумерация идёт в течении года (!), т.е. обычно в январе 1 договор имеет номер 1

   МимохожийОднако

34 — 03.05.14 — 07:25

В СКД можно при вычислении указать функцию общего модуля, которая будет выделять число из строки.

   zippygrill

35 — 03.05.14 — 09:46

Выразить(&номерСтрокогоТипа как число(15.2))

   ДенисЧ

36 — 03.05.14 — 09:59

(35) Что пил?

   Обработка

37 — 03.05.14 — 11:15

(0) Я бы задачу решил с другого конца.

Перенумеровал бы все номера догвооров как следует.

Например 99 на 00099 итп и тогда 00320 точно будет больше чем 00099.

Как вариант превратить их в числовое поле.

И не надо тогда парить себя мозг.

А если мешают нули при выводе на печать то их всегда можно убрать…

   Torquader

38 — 03.05.14 — 13:05

(37) Добавлять нули — убирать нули — следить, чтобы пользователи число написали с правильным числом нулей.

Число — и всё само решится.

Если нужны номера с галочками и т.п. — поле «входящий номер» избавит от всяких вопросов.

   sapravka

39 — 03.05.14 — 17:13

А подскажите пожалуйста еще:

Вот написал:

Пока НомерСпецификации.Следующий() Цикл

            Если НомерСпецификации.НомерСпецификацииНужный = Null  Тогда

                Если НомерСпецификации.НомерСпецификацииНужный = 0 Тогда

                    Движение.НомерСпецификации = 1;

                Иначе

                    НомерНаОдинБольше = НомерСпецификации.НомерСпецификацииНужный + 1;

                    Движение.НомерСпецификации = НомерНаОдинБольше;

                КонецЕсли;

            Иначе

                НомерНаОдинБольше = НомерСпецификации.НомерСпецификацииНужный + 1;

                Движение.НомерСпецификации = НомерНаОдинБольше;

            КонецЕсли;

КонецЦикла;

Но почему то при проведении документа получается:

http://волгалаб.рф/1c/166.jpg

То есть первый номер спецификации вообще ничего не ставит, так как его еще нет…

Подскажите, какое поставить условие, что бы номер 1 ставился…

Я просто уже много перепробовал, но почему то первый номер вообще ничего не ставит, а уже со второго начинает плюсовать по 1, а вот необходимо что бы с первого номера плюсовать по одному….

   Обработка

40 — 03.05.14 — 18:21

(38) А зачем следить? Ведь 1С делает автонумерацию сама.

Я всгда был против того чтоб номера трогал юзеры.

   MKZM

41 — 03.05.14 — 18:40

Если НомерСпецификации.НомерСпецификацииНужный = Null  Тогда

                Если НомерСпецификации.НомерСпецификацииНужный = 0 Тогда

Забавно.

   Torquader

42 — 03.05.14 — 18:46

(41) Видимо, про ИЛИ человек не знает.

   sapravka

43 — 03.05.14 — 19:50

(42) да ИЛИ тоже ставил, но все равно не ставить первый номер 1 — вообще ничего не ставит

Подскажите, что прописать — если вообще ничего нет — что бы 1 ставил в номере…

   hhhh

44 — 03.05.14 — 20:02

(43) ну вот ты пишешь

     Если НомерСпецификации.НомерСпецификацииНужный = Null  Тогда

а потом вдруг

НомерНаОдинБольше = НомерСпецификации.НомерСпецификацииНужный + 1;

разве можно к NULL добавлять 1? Ведь бред.

   sapravka

45 — 03.05.14 — 20:36

(44) Да так тоже пробывал:

Если НомерСпецификации.НомерСпецификацииНужный = НЕОПРЕДЕЛЕНО  Тогда

все равно как бы вообще проскакивает при создании и вообще никакакой номер не создает

   hhhh

46 — 03.05.14 — 20:41

(45) ну запомните

Null + 1 = Null

   Адимр

47 — 03.05.14 — 21:59

Вопрос на засыпку, а что больше число 5 или пустая строка «»? :))

  

Torquader

48 — 03.05.14 — 22:08

(47) Исключение, которое вернёт такое сравнение, больше ^_^

  1. Здравствуйте.
    Необходимо получить максимальное значение из запроса. Но он просто группирует по данному реквизиту (Показатель1). Тип — число.
    Что не верно написано? Необходимо чтобы по сумме все сложил, ничего не выкинув, а Показатель1 вывел максимальный.

        |ВЫБРАТЬ
        |    ВТ1.Сотрудник,
        |    ВТ1.ВидУчетаВремени,
        |    ВТ1.ОтработаноДней,
        |    ВТ1.ОтработаноЧасов,
        |    СУММА(ВТ1.Результат) КАК Результат,
        |    МАКСИМУМ(ВТ1.Показатель1) КАК Показатель1
        |ПОМЕСТИТЬ ВТ2
        |ИЗ
        |    ВТ1 КАК ВТ1
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ1.Сотрудник,
        |    ВТ1.ВидУчетаВремени,
        |    ВТ1.ОтработаноДней,
        |    ВТ1.ОтработаноЧасов
        |;
    

  2. TerANik

    Offline

    TerANik
    Профессионал в 1С

    Регистрация:
    19 ноя 2014
    Сообщения:
    1.281
    Симпатии:
    98
    Баллы:
    54

    Нужно отсортировать по значению Показатель1 и выбрать первое значение.


  3. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.880
    Симпатии:
    1.028
    Баллы:
    204

    Приведенный текст запроса должен работать как вам нужно.
    Возможно, проблемы в другом.

  4. Так вообще пропало значение Показатель1, ОтработаноДней и ОтработаноЧасов (Null и нулевые).

        |ВЫБРАТЬ ПЕРВЫЕ 1
        |    ВТ1.Сотрудник,
        |    ВТ1.ВидУчетаВремени,
        |    ВТ1.ОтработаноДней,
        |    ВТ1.ОтработаноЧасов,
        |    СУММА(ВТ1.Результат) КАК Результат,
        |    МАКСИМУМ(ВТ1.Показатель1) КАК Показатель1
        |ПОМЕСТИТЬ ВТ2
        |ИЗ
        |    ВТ1 КАК ВТ1
        |
        |СГРУППИРОВАТЬ ПО
        |    ВТ1.Сотрудник,
        |    ВТ1.ВидУчетаВремени,
        |    ВТ1.ОтработаноДней,
        |    ВТ1.ОтработаноЧасов
        |
        |УПОРЯДОЧИТЬ ПО
        |    Показатель1
        |;

  5. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.880
    Симпатии:
    1.028
    Баллы:
    204

    Приходим к выводу, что значения не совсем числовые :)

  6. Значения числовые, тип = Число.


  7. nomad_irk

    Offline

    nomad_irk
    Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.880
    Симпатии:
    1.028
    Баллы:
    204

    NULL — не число и это будет максимальным значением, если не ошибаюсь….

  8. Я разобрался, вчера видимо зациклился, сам виноват. Ведь ОтработаноДней и ОтработаноЧасов — тоже уникальные значения, нужно было по ним тоже суммировать, тогда все сложилось как надо. А я по ним группировал, они и не давали свернуться.


1C-pro.ru - форум по 1С:Предприятию 7.7, 8.0, 8.1, 8.2, 8.3


Описание

Примеры использования группировки в запросе 1С. Простая группировка, условие после группировки и др.

Запросы. Группировка записей

Оглавление (нажмите, чтобы раскрыть)

Количество записей

Пример выбора общего и различного количества записей в запросе 1С

//По каждому сотруднику получаем общее количество
//записей и количество видов расчета в регистре "Начисления"

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ 
    |   Сотрудник.Наименование КАК ФИО,
    |   КОЛИЧЕСТВО(*) Количество,
    |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВидРасчета) КАК КоличествоВидовРасчета
    |ИЗ
    |   РегистрРасчета.Начисления
    |
    |СГРУППИРОВАТЬ ПО
    |   Сотрудник";

 Выборка = Запрос.Выполнить().Выбрать();

 Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.ФИО + ": " + Выборка.Количество +
        ", " + Выборка.КоличествоВидовРасчета);
КонецЦикла;

Минимальное, максимальное и среднее значения

Пример выбора минимального, максимального и среднего значения в запросе 1С

//Получаем масимальное, минимальное и среднее
//начисление по каждому виду расчета

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ 
    |   ВидРасчета,
    |   МИНИМУМ(Результат) КАК Мин,
    |   МАКСИМУМ(Результат) КАК Макс,
    |   СРЕДНЕЕ(Результат) КАК Сред
    |ИЗ
    |   РегистрРасчета.Начисления
    |
    |СГРУППИРОВАТЬ ПО
    |   ВидРасчета";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("" + Выборка.ВидРасчета + ": " +
        Выборка.Мин + ", " + Выборка.Макс + ", " +
         Выборка.Сред);
КонецЦикла;

Простая группировка

Пример использования простой группировки в запросе 1С

//Получаем итоговые суммы по каждому виду расчета

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ 
    |   ВидРасчета,
    |   СУММА(Результат) КАК Результат
    |ИЗ
    |   РегистрРасчета.Начисления
    |
    |СГРУППИРОВАТЬ ПО
    |   ВидРасчета";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить("" + Выборка.ВидРасчета + ": " +
        Выборка.Результат);
КонецЦикла;

Условие после группировки

Пример задания условия после группировки в запросе 1С

//По каждому сотруднику получаем количество видов расчета в регистре "Начисления"
//Затем выводим только записи, у которых количество различных видов расчета больше 2

Запрос = Новый Запрос;
Запрос.Текст =
    "ВЫБРАТЬ 
    |   Сотрудник.Наименование КАК ФИО,
    |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВидРасчета) КАК Количество
    |ИЗ
    |   РегистрРасчета.Начисления
    |
    |СГРУППИРОВАТЬ ПО
    |   Сотрудник
    |ИМЕЮЩИЕ 
    |   КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВидРасчета) > 2";

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл
    Сообщить(Выборка.ФИО + ": " + Выборка.Количество);
КонецЦикла;

Ключи: 1С | Запросы

Понравилась статья? Поделить с друзьями:
  • Как составить бизнес план цветочного магазина образец
  • Как исправить молоткообразные пальцы на ногах
  • При потери смартфона как его найти
  • Как найти ту самую любимую работу
  • Как правильно составить семантическое ядро для интернет магазина