Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > 1С: Проблемы и решения > Помогите с запросом


Автор: ^D^ima 05.12.21, 11:22
Запрос выдает определенные поля таблицы.
Месяц, Сотрудник, Процент



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

Т.е. должно быть что-то такое:
МесяцСотрудникПроцентУникальных записей
01Иванов502
01Иванов602
02Иванов702
04Петров601
04Петров701
04Петров701

Автор: evGenius 05.12.21, 11:37
1. Сформировать временную таблицу, сгруппировав по Месяц, Сотрудник, КОЛИЧЕСТВО(Процент).
2. Внутреннее соединение с этой временной таблицей.

Автор: ^D^ima 05.12.21, 13:31
Можно минимальный пример?

Автор: MIF 05.12.21, 13:56
Пример не совпадает с текстом. Уникальных записей 04-Петров = 2, а 02-Иванов =1

Автор: ^D^ima 05.12.21, 19:20
MIF
Уникальных Месяц, сотрудник, это выделено жирным

Автор: evGenius 05.12.21, 20:38
Возможно так.
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ВЫБРАТЬ
      ТЧ.Сотрудник,
      КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТЧ.Месяц) КАК УникальныхЗаписей
    ПОМЕСТИТЬ Итог
    ИЗ
      ТЧ
    СГРУППИРОВАТЬ ПО
      ТЧ.Сотрудник
    ;
     
    ВЫБРАТЬ
      ТЧ.Сотрудник,
      ТЧ.Месяц,
      ТЧ.Процент,
      Итог.УникальныхЗаписей
    ИЗ
      ТЧ ВНУТРЕННЕЕ СОЕДИНЕНИЕ Итог ПО ТЧ.Сотрудник = Итог.Сотрудник


Добавлено
Видимо имелось в виду, что в столбце нужно вывести количество различных месяцев, упомянутых для сотрудника :wacko:

Автор: ^D^ima 06.12.21, 18:44
Цитата evGenius @
Видимо имелось в виду, что в столбце нужно вывести количество различных месяцев, упомянутых для сотрудника

Да. Я так и написал :)

Автор: MIF 06.12.21, 19:22
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    UPDATE aaa
    SET aaa.NumMonth = bbb.Cnt
    FROM
    (
    SELECT Employee, COUNT(DISTINCT Month) AS cnt
    FROM myTable
    GROUP BY Employee
    ) AS  bbb
    JOIN myTable aaa ON aaa.Empolyee = bbb.Employee

Автор: ^D^ima 06.12.21, 20:20
А как можно найти количество различных сумм?
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    КОЛИЧЕСТВО(РАЗЛИЧНЫЕ сумма(ФинальнаяТаблица.Н2_СуммаРасчетная)) КАК УникальнаяСуммаРасчетная

Или придется вначале выдергивать подзазпросом сумму, а затем брать КОЛИЧЕСТВО РАЗЛИЧНЫЕ?

Автор: ^D^ima 07.12.21, 21:01
Как я замучился с 1с...

Преамбула:
Программист оставил отчет сколько сотрудник выручил денег в месяц через СКД и свалил:
Его концовка:
Скрытый текст

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ВЫБРАТЬ
        ОтгрузкиСПрошлымиПроцентами.Период КАК Н2_Период,
        ОтгрузкиСПрошлымиПроцентами.Сделка КАК Н2_Сделка,
        ОтгрузкиСПрошлымиПроцентами.Сотрудник КАК Н2_Сотрудник,
        ОтгрузкиСПрошлымиПроцентами.СуммаДокумента КАК Н2_СуммаСделки,
        ОтгрузкиСПрошлымиПроцентами.Расходы КАК Н2_Расходы,
        ОтгрузкиСПрошлымиПроцентами.Выручка КАК Н2_Выручка,
        ОтгрузкиСПрошлымиПроцентами.АбонентскоеОбслуживание КАК Н2_АбонентскоеОбслуживание,
        ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузкиПрошлыйГод КАК Н2_ПроцентОтгрузкиПрошлыйГод,
        ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузкиПредыдущий КАК Н2_ПроцентОтгрузкиПредыдущий,
        ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузки КАК Н2_ПроцентОтгрузки,
        ВЫБОР
            КОГДА ОтгрузкиСПрошлымиПроцентами.АбонентскоеОбслуживание
                ТОГДА ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузки * ОтгрузкиСПрошлымиПроцентами.Выручка / 100
            ИНАЧЕ ВЫБОР
                    КОГДА ЕСТЬNULL(ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузки, 0) = 0
                        ТОГДА 0
                    КОГДА ЕСТЬNULL(ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузкиПредыдущий, 0) > 0
                        ТОГДА (ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузки - ЕСТЬNULL(ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузкиПредыдущий, 0)) * ОтгрузкиСПрошлымиПроцентами.Выручка / 100
                    ИНАЧЕ (ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузки - ЕСТЬNULL(ОтгрузкиСПрошлымиПроцентами.ПроцентОтгрузкиПрошлыйГод, 0)) * ОтгрузкиСПрошлымиПроцентами.Выручка / 100
                КОНЕЦ
        КОНЕЦ КАК Н2_СуммаРасчетная,
        ОтгрузкиСПрошлымиПроцентами.Подразделение КАК Н2_Подразделение,
        ВложенныйЗапрос.КоличествоПериодов КАК КоличествоПериодов,
        ОтгрузкиСПрошлымиПроцентами.НомерСделкиБ24 КАК Н2_НомерСделкиБ24
    ПОМЕСТИТЬ ФинальнаяТаблица
    ИЗ
        ОтгрузкиСПрошлымиПроцентами КАК ОтгрузкиСПрошлымиПроцентами
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
                КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ОтгрузкиСПрошлымиПроцентами.Период) КАК КоличествоПериодов
            ИЗ
                ОтгрузкиСПрошлымиПроцентами КАК ОтгрузкиСПрошлымиПроцентами) КАК ВложенныйЗапрос
            ПО (ИСТИНА)
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Период КАК Н2_Период,
        ФинальнаяТаблица.Н2_Сделка КАК Н2_Сделка,
        ФинальнаяТаблица.Н2_Сотрудник КАК Н2_Сотрудник,
        ФинальнаяТаблица.Н2_СуммаСделки КАК Н2_СуммаСделки,
        ФинальнаяТаблица.Н2_Расходы КАК Н2_Расходы,
        ФинальнаяТаблица.Н2_Выручка КАК Н2_Выручка,
        ФинальнаяТаблица.Н2_АбонентскоеОбслуживание КАК Н2_АбонентскоеОбслуживание,
        ФинальнаяТаблица.Н2_ПроцентОтгрузкиПрошлыйГод КАК Н2_ПроцентОтгрузкиПрошлыйГод,
        ФинальнаяТаблица.Н2_ПроцентОтгрузкиПредыдущий КАК Н2_ПроцентОтгрузкиПредыдущий,
        ФинальнаяТаблица.Н2_ПроцентОтгрузки КАК Н2_ПроцентОтгрузки,
        ВЫБОР
            КОГДА ВЫРАЗИТЬ(ФинальнаяТаблица.Н2_Подразделение КАК Справочник.СтруктурныеЕдиницы).Наименование ПОДОБНО "Юридическое сопровождение бизнеса"
                    И ФинальнаяТаблица.Н2_Период < ДАТАВРЕМЯ(2020, 4, 1)
                ТОГДА 0
            ИНАЧЕ ФинальнаяТаблица.Н2_СуммаРасчетная
        КОНЕЦ КАК Н2_СуммаРасчетная,
        ФинальнаяТаблица.Н2_Подразделение КАК Н2_Подразделение,
        ВЫБОР
            КОГДА ВЫРАЗИТЬ(ФинальнаяТаблица.Н2_Подразделение КАК Справочник.СтруктурныеЕдиницы).Наименование ПОДОБНО "Юридическое сопровождение бизнеса"
                    И ФинальнаяТаблица.Н2_Период < ДАТАВРЕМЯ(2021, 1, 1)
                ТОГДА ВЫБОР
                        КОГДА ФинальнаяТаблица.КоличествоПериодов - 3 < 0
                            ТОГДА 0
                        ИНАЧЕ ФинальнаяТаблица.КоличествоПериодов - 3
                    КОНЕЦ
            ИНАЧЕ ФинальнаяТаблица.КоличествоПериодов
        КОНЕЦ КАК КоличествоПериодов,
        ФинальнаяТаблица.Н2_НомерСделкиБ24 КАК Н2_НомерСделкиБ24
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица



Косяк в том, что он КоличествоПериодов считал из количества месяцев, а так как сотрудник мог в месяц ничего не заработать, средняя сумма(среднее число выручки \ КоличествоПериодов) не соответствовало реальности. Например отчет за 4 месяца, а 2 месяца сотрудник не работал, получалось что отчет сумму выручки делил на 4 а не на 2.

Я этот косяк исправил: Просуммировал все суммы по сотрудникам. Нашел количество уникальных сумм. На это число и предполагалось делить общую сумму выручки

Скрытый текст
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Сотрудник КАК Сотрудник,
        ФинальнаяТаблица.Н2_Период КАК Н2_Период,
        СУММА(ФинальнаяТаблица.Н2_СуммаРасчетная) КАК УникальнаяСуммаРасчетная
    ПОМЕСТИТЬ ТаблицаУникальнаяСуммаРасчетнаяСумма
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица
    ГДЕ
        ФинальнаяТаблица.Н2_СуммаРасчетная > 0
     
    СГРУППИРОВАТЬ ПО
        ФинальнаяТаблица.Н2_Сотрудник,
        ФинальнаяТаблица.Н2_Период
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Сотрудник КАК Сотрудник,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ТаблицаУникальнаяСуммаРасчетнаяСумма.УникальнаяСуммаРасчетная) КАК УникальнаяСуммаРасчетная
    ПОМЕСТИТЬ ТаблицаУникальнаяСуммаРасчетная
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица
            ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаУникальнаяСуммаРасчетнаяСумма КАК ТаблицаУникальнаяСуммаРасчетнаяСумма
            ПО ФинальнаяТаблица.Н2_Сотрудник = ТаблицаУникальнаяСуммаРасчетнаяСумма.Сотрудник
     
    СГРУППИРОВАТЬ ПО
        ФинальнаяТаблица.Н2_Сотрудник
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Период КАК Н2_Период,
        ФинальнаяТаблица.Н2_Сделка КАК Н2_Сделка,
        ФинальнаяТаблица.Н2_Сотрудник КАК Н2_Сотрудник,
        ФинальнаяТаблица.Н2_СуммаСделки КАК Н2_СуммаСделки,
        ФинальнаяТаблица.Н2_Расходы КАК Н2_Расходы,
        ФинальнаяТаблица.Н2_Выручка КАК Н2_Выручка,
        ФинальнаяТаблица.Н2_АбонентскоеОбслуживание КАК Н2_АбонентскоеОбслуживание,
        ФинальнаяТаблица.Н2_ПроцентОтгрузкиПрошлыйГод КАК Н2_ПроцентОтгрузкиПрошлыйГод,
        ФинальнаяТаблица.Н2_ПроцентОтгрузкиПредыдущий КАК Н2_ПроцентОтгрузкиПредыдущий,
        ФинальнаяТаблица.Н2_ПроцентОтгрузки КАК Н2_ПроцентОтгрузки,
        ФинальнаяТаблица.Н2_СуммаРасчетная КАК Н2_СуммаРасчетная,
        ФинальнаяТаблица.Н2_Подразделение КАК Н2_Подразделение,
        ТаблицаУникальнаяСуммаРасчетная.УникальнаяСуммаРасчетная КАК КоличествоПериодов,
        ФинальнаяТаблица.Н2_НомерСделкиБ24 КАК Н2_НомерСделкиБ24
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица
            ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаУникальнаяСуммаРасчетная КАК ТаблицаУникальнаяСуммаРасчетная
            ПО ФинальнаяТаблица.Н2_Сотрудник = ТаблицаУникальнаяСуммаРасчетная.Сотрудник


Проблема:
Само название переменной КоличествоПериодов я не менял, но в самом графическом отображении отчета получаю в КоличествоПериодов везде 1:
Вот результаты запроса(новые и старые отчеты совпадают по значениям кроме переменной КоличествоПериодов):
Например у "Юлия" стоит период 2 в результате запроса, а в графике 1
Вот такой результат со старым запросом(4 месяца)
OldQuery.png (, : 74)

Вот такой результат с новым запросом
NewQuery.png (, : 82)

Сами данные(на основании консоли запросов)
OldNewQuery.rar (, : 81)

Так это выглядит в СКД:
SKD.png (, : 81)

Где я допустил ошибку?

Автор: ^D^ima 07.12.21, 21:34
Походу это СКД что-то оптимизирует. Как это х-ню отключить?

Автор: Rust 09.12.21, 08:13
Цитата ^D^ima @
Походу это СКД что-то оптимизирует. Как это х-ню отключить?

При помощи Консоли СКД (аналог консоли запросов) можно посмотреть результирующий запрос к базе.
Выгрузи схему отчета и настройки в файл, загрузи в СКД, нажми Сформировать. На закладке "Макет для табличного документа" можно найти текст запроса, который реально будет исполняться системой при формировании отчета



Автор: ^D^ima 28.03.22, 21:21
Я разобрался.
В консоли запросов такой запрос:
Скрытый текст

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Сотрудник КАК Сотрудник,
        ФинальнаяТаблица.Н2_Период КАК Н2_Период,
        СУММА(ФинальнаяТаблица.Н2_СуммаРасчетная) КАК УникальнаяСуммаРасчетная
    ПОМЕСТИТЬ ТаблицаУникальнаяСуммаРасчетнаяСумма
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица
    ГДЕ
        ФинальнаяТаблица.Н2_СуммаРасчетная > 0
     
    СГРУППИРОВАТЬ ПО
        ФинальнаяТаблица.Н2_Сотрудник,
        ФинальнаяТаблица.Н2_Период
    ;
     
    ////////////////////////////////////////////////////////////////////////////////
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Сотрудник КАК Сотрудник,
        ТаблицаУникальнаяСуммаРасчетнаяСумма.УникальнаяСуммаРасчетная КАК УникальнаяСуммаРасчетная
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица
            ЛЕВОЕ СОЕДИНЕНИЕ ТаблицаУникальнаяСуммаРасчетнаяСумма КАК ТаблицаУникальнаяСуммаРасчетнаяСумма
            ПО ФинальнаяТаблица.Н2_Сотрудник = ТаблицаУникальнаяСуммаРасчетнаяСумма.Сотрудник



Обрабатывается так что для Сотрудник имеет несколько записей УникальнаяСуммаРасчетная
А долбанная СКД при том-же запросе почему-то группирует по Сотрудник и на выходе получается 1 Сотрудник и 1 запись УникальнаяСуммаРасчетная.
Получается что результат работы 1 запроса(если визуально вывести данные на экран через СКД) не соответствуют тому что он положил во временную таблицу(ТаблицаУникальнаяСуммаРасчетнаяСумма). Это как так?

Переделал без временной таблицы, в 1 запросе:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    ВЫБРАТЬ
        ФинальнаяТаблица.Н2_Сотрудник КАК Сотрудник,
        КОЛИЧЕСТВО(РАЗЛИЧНЫЕ ВложенныйЗапрос.УникальнаяСуммаРасчетная) КАК УникальнаяСуммаРасчетная
    ИЗ
        ФинальнаяТаблица КАК ФинальнаяТаблица
            ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
                ФинальнаяТаблица.Н2_Сотрудник КАК Сотрудник,
                ФинальнаяТаблица.Н2_Период КАК Н2_Период,
                СУММА(ФинальнаяТаблица.Н2_СуммаРасчетная) КАК УникальнаяСуммаРасчетная
            ИЗ
                ФинальнаяТаблица КАК ФинальнаяТаблица
            ГДЕ
                ФинальнаяТаблица.Н2_СуммаРасчетная > 0
            
            СГРУППИРОВАТЬ ПО
                ФинальнаяТаблица.Н2_Сотрудник,
                ФинальнаяТаблица.Н2_Период) КАК ВложенныйЗапрос
            ПО ФинальнаяТаблица.Н2_Сотрудник = ВложенныйЗапрос.Сотрудник
     
    СГРУППИРОВАТЬ ПО
        ФинальнаяТаблица.Н2_Сотрудник


Все заработало.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)