Добрый день.
Написал следующий запрос:
Но при его выполнении не получаю должность и подразделение сотрудника. Хотя, если прогнать отдельно вложенный запрос
, указав ссылку на сотрудника, то все прекрасно отрабатывает и должность с подразделением получаю. Как заставить работать общий запрос? Подскажите, пожалуйста, в чем косяк мой.
Написал следующий запрос:
ВЫБРАТЬ
ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Фамилия + " " + ФИОФизическихЛицСрезПоследних.Имя + " " + ФИОФизическихЛицСрезПоследних.Отчество, ТЧСотрудники.Сотрудник.Наименование) КАК ФИО,
ТЧСотрудники.Сотрудник КАК Сотрудник,
ТЧСотрудники.ДатаВыхода КАК ДатаВыхода,
ТЧСотрудники.ОтработаноЧасов КАК ОтработаноЧасов,
ДолжностьИПодразделение.Должность КАК Должность,
ДолжностьИПодразделение.Подразделение КАК Подразделение
ИЗ
(ВЫБРАТЬ
РаботаВВыходныеИПраздничныеДниСотрудники.Дата КАК ДатаВыхода,
СУММА(РаботаВВыходныеИПраздничныеДниСотрудники.ОтработаноЧасов) КАК ОтработаноЧасов,
РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник КАК Сотрудник
ИЗ
Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК РаботаВВыходныеИПраздничныеДниСотрудники
ГДЕ
РаботаВВыходныеИПраздничныеДниСотрудники.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник,
РаботаВВыходныеИПраздничныеДниСотрудники.Дата) КАК ТЧСотрудники
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОФизическихЛицСрезПоследних
ПО ТЧСотрудники.Сотрудник.ФизическоеЛицо = ФИОФизическихЛицСрезПоследних.ФизическоеЛицо
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Начало КАК Начало,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
УПОРЯДОЧИТЬ ПО
Начало УБЫВ) КАК ДолжностьИПодразделение
ПО ТЧСотрудники.Сотрудник = ДолжностьИПодразделение.Сотрудник
УПОРЯДОЧИТЬ ПО
ДатаВыхода,
ФИО
ПоказатьНо при его выполнении не получаю должность и подразделение сотрудника. Хотя, если прогнать отдельно вложенный запрос
ВЫБРАТЬ ПЕРВЫЕ 1
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Начало КАК Начало,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
УПОРЯДОЧИТЬ ПО
Начало УБЫВ
ПоказатьПо теме из базы знаний
- Структура иерархического справочника запросом
- Неоптимальности вида «план исполнения запроса "испортился"» - поиск и исправление
- Планы запросов - это просто! Разбор оптимизаций запросов PostgreSQL на живых примерах
- Распространенные ошибки разработчиков, приводящие к проблемам производительности
- Экспертный взгляд на оптимизацию производительности на примере исправления и декомпозиции запроса
Найденные решения
В Вашем случае необходимо определить последнюю занимаемую должность и подразделение сотрудником.
Из выложенного алгоритма ясно, что автор не предусмотрел смену должности/подразделения
сотрудниками позже анализируемого документа "РаботаВВыходныеИПраздничныеДни".
Т.е. если делаем запрос по старому документу, где есть сотрудник,
сменивший должность или подразделение после даты этого документа, то должность/подразделение
будет определяться неверно.
Если это не принципиально(м.б. запрос будет только по последнему сформированному документу),
то вот такой пакет отработает верно:
Если же принципиально, то необходимо добавить ограничение на дату документа, чтобы занимаемая
должность/подразделение из регистра "ДанныеДляПодбораСотрудников" бралась не позже, скорее всего по периоду.
Из выложенного алгоритма ясно, что автор не предусмотрел смену должности/подразделения
сотрудниками позже анализируемого документа "РаботаВВыходныеИПраздничныеДни".
Т.е. если делаем запрос по старому документу, где есть сотрудник,
сменивший должность или подразделение после даты этого документа, то должность/подразделение
будет определяться неверно.
Если это не принципиально(м.б. запрос будет только по последнему сформированному документу),
то вот такой пакет отработает верно:
ВЫБРАТЬ
РаботаВВыходныеИПраздничныеДниСотрудники.Дата КАК ДатаВыхода,
СУММА(РаботаВВыходныеИПраздничныеДниСотрудники.ОтработаноЧасов) КАК ОтработаноЧасов,
РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_Док
ИЗ
Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК РаботаВВыходныеИПраздничныеДниСотрудники
ГДЕ
РаботаВВыходныеИПраздничныеДниСотрудники.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник,
РаботаВВыходныеИПраздничныеДниСотрудники.Дата
;
ВЫБРАТЬ
Максимум(ДанныеДляПодбораСотрудников.Начало) КАК МаксимальноеНачало,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_ПоследняяДатаДолжности
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ГДЕ ДанныеДляПодбораСотрудников.Сотрудник В (Выбрать ВТ_Док.Сотрудник из ВТ_Док КАК ВТ_Док)
СГРУППИРОВАТЬ ПО
ДанныеДляПодбораСотрудников.Сотрудник
;
ВЫБРАТЬ ВТ_ПоследняяДатаДолжности.МаксимальноеНачало КАК Начало,
ВТ_ПоследняяДатаДолжности.Сотрудник,
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение
ПОМЕСТИТЬ ВТ_Должность
ИЗ ВТ_ПоследняяДатаДолжности как ВТ_ПоследняяДатаДолжности
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ПО ВТ_ПоследняяДатаДолжности.Сотрудник = ДанныеДляПодбораСотрудников.Сотрудник
И ВТ_ПоследняяДатаДолжности.МаксимальноеНачало=ДанныеДляПодбораСотрудников.Начало
;
ВЫБРАТЬ ВТ_Док.ДатаВыхода,
ВТ_Док.ОтработаноЧасов,
ВТ_Док.Сотрудник,
ВТ_Должность.Должность,
ВТ_Должность.Подразделение,
ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Фамилия + " " + ФИОФизическихЛицСрезПоследних.Имя + " " + ФИОФизическихЛицСрезПоследних.Отчество, ВТ_Док.Сотрудник.Наименование) КАК ФИО
ИЗ ВТ_Док КАК ВТ_Док
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Должность КАК ВТ_Должность
ПО ВТ_Док.Сотрудник =ВТ_Должность.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОФизическихЛицСрезПоследних
ПО ВТ_Док.Сотрудник.ФизическоеЛицо = ФИОФизическихЛицСрезПоследних.ФизическоеЛицо
УПОРЯДОЧИТЬ ПО ФИО
ПоказатьЕсли же принципиально, то необходимо добавить ограничение на дату документа, чтобы занимаемая
должность/подразделение из регистра "ДанныеДляПодбораСотрудников" бралась не позже, скорее всего по периоду.
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(12)
ЛЕВОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ ПЕРВЫЕ 1
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Начало КАК Начало,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
УПОРЯДОЧИТЬ ПО
Начало УБЫВ) КАК ДолжностьИПодразделение
Показать
(0) Проверьте что у вас получается вот в этом запросе
ВЫБРАТЬ ПЕРВЫЕ 1
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Начало КАК Начало,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
УПОРЯДОЧИТЬ ПО
Начало УБЫВ
Показать
(10) Если я правильно понял у вас есть некая ТЧ с данными сотрудников. В одну ВТ отберите данные из этой ТЧ, в другую данные из регистра и только потом левым соединением их свяжите. Данные из регистра отбирайте по нужной вам должности и сгруппируйте их необходимым для вас способом, чтоб в результете была только нужная вам таблица.
(11) Дело в том, что понять какая должность мне нужна можно по дате начала ее действия (хранится в том же регистре). Поэтому я и сортирую по убыванию по дате. И если я помещаю данные из регистра во временную таблицу, то я так же получу только 1 запись, ту же самую, что и в имеющемся запросе, или нет?
Вам именно запрос нужен? Такое решение не подойдет?
Запрос=новый Запрос;
Запрос.Текст=
"ВЫБРАТЬ
| Сотрудники.Ссылка КАК Ссылка
|ИЗ
| Справочник.Сотрудники КАК Сотрудники";
ТЗСотрудники=Запрос.Выполнить().Выгрузить();
МассивСотрудников=ТЗСотрудники.ВыгрузитьКолонку("Ссылка");
ТЗСотрудники = КадровыйУчет.КадровыеДанныеСотрудников(Истина, МассивСотрудников, "ДатаПриема,ДатаУвольнения,ТекущийВидЗанятости,ТекущаяДолжность,ТекущееПодразделение", ДатаОтчета);
Показать
Почему у вас в общем запросе нет отбора по сотруднику в подзапросе
Вы же получаете данные не по нужному сотруднику а по ДРУГОМУ первому попавшемуся и потом естественно не будет срабатывать левое соединение так как это не тот сотрудник который вам нужен...
ВЫБРАТЬ ПЕРВЫЕ 1
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Начало КАК Начало,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
УПОРЯДОЧИТЬ ПО
Начало УБЫВ
ПоказатьВы же получаете данные не по нужному сотруднику а по ДРУГОМУ первому попавшемуся и потом естественно не будет срабатывать левое соединение так как это не тот сотрудник который вам нужен...
(18) Ну так левое соединение и нужно для отбора.
А у вас из чего отбирать если вы чётко пишете что отобрать первую попавшуюся запись а все остальные отбросить?
Обычно пишется вложенный запрос внутри вложенного запроса где например для каждого физического лица отбирается критерий уникальности, например максимальный идентификатор записи, а уже потом выполняем соединение и остается только одна строка на каждое физлицо... потом уже присоединить эту уникальную строку не проблема.
А у вас из чего отбирать если вы чётко пишете что отобрать первую попавшуюся запись а все остальные отбросить?
Обычно пишется вложенный запрос внутри вложенного запроса где например для каждого физического лица отбирается критерий уникальности, например максимальный идентификатор записи, а уже потом выполняем соединение и остается только одна строка на каждое физлицо... потом уже присоединить эту уникальную строку не проблема.
В Вашем случае необходимо определить последнюю занимаемую должность и подразделение сотрудником.
Из выложенного алгоритма ясно, что автор не предусмотрел смену должности/подразделения
сотрудниками позже анализируемого документа "РаботаВВыходныеИПраздничныеДни".
Т.е. если делаем запрос по старому документу, где есть сотрудник,
сменивший должность или подразделение после даты этого документа, то должность/подразделение
будет определяться неверно.
Если это не принципиально(м.б. запрос будет только по последнему сформированному документу),
то вот такой пакет отработает верно:
Если же принципиально, то необходимо добавить ограничение на дату документа, чтобы занимаемая
должность/подразделение из регистра "ДанныеДляПодбораСотрудников" бралась не позже, скорее всего по периоду.
Из выложенного алгоритма ясно, что автор не предусмотрел смену должности/подразделения
сотрудниками позже анализируемого документа "РаботаВВыходныеИПраздничныеДни".
Т.е. если делаем запрос по старому документу, где есть сотрудник,
сменивший должность или подразделение после даты этого документа, то должность/подразделение
будет определяться неверно.
Если это не принципиально(м.б. запрос будет только по последнему сформированному документу),
то вот такой пакет отработает верно:
ВЫБРАТЬ
РаботаВВыходныеИПраздничныеДниСотрудники.Дата КАК ДатаВыхода,
СУММА(РаботаВВыходныеИПраздничныеДниСотрудники.ОтработаноЧасов) КАК ОтработаноЧасов,
РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_Док
ИЗ
Документ.РаботаВВыходныеИПраздничныеДни.Сотрудники КАК РаботаВВыходныеИПраздничныеДниСотрудники
ГДЕ
РаботаВВыходныеИПраздничныеДниСотрудники.Ссылка = &Ссылка
СГРУППИРОВАТЬ ПО
РаботаВВыходныеИПраздничныеДниСотрудники.Сотрудник,
РаботаВВыходныеИПраздничныеДниСотрудники.Дата
;
ВЫБРАТЬ
Максимум(ДанныеДляПодбораСотрудников.Начало) КАК МаксимальноеНачало,
ДанныеДляПодбораСотрудников.Сотрудник КАК Сотрудник
ПОМЕСТИТЬ ВТ_ПоследняяДатаДолжности
ИЗ
РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ГДЕ ДанныеДляПодбораСотрудников.Сотрудник В (Выбрать ВТ_Док.Сотрудник из ВТ_Док КАК ВТ_Док)
СГРУППИРОВАТЬ ПО
ДанныеДляПодбораСотрудников.Сотрудник
;
ВЫБРАТЬ ВТ_ПоследняяДатаДолжности.МаксимальноеНачало КАК Начало,
ВТ_ПоследняяДатаДолжности.Сотрудник,
ДанныеДляПодбораСотрудников.Должность КАК Должность,
ДанныеДляПодбораСотрудников.Подразделение КАК Подразделение
ПОМЕСТИТЬ ВТ_Должность
ИЗ ВТ_ПоследняяДатаДолжности как ВТ_ПоследняяДатаДолжности
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ДанныеДляПодбораСотрудников КАК ДанныеДляПодбораСотрудников
ПО ВТ_ПоследняяДатаДолжности.Сотрудник = ДанныеДляПодбораСотрудников.Сотрудник
И ВТ_ПоследняяДатаДолжности.МаксимальноеНачало=ДанныеДляПодбораСотрудников.Начало
;
ВЫБРАТЬ ВТ_Док.ДатаВыхода,
ВТ_Док.ОтработаноЧасов,
ВТ_Док.Сотрудник,
ВТ_Должность.Должность,
ВТ_Должность.Подразделение,
ЕСТЬNULL(ФИОФизическихЛицСрезПоследних.Фамилия + " " + ФИОФизическихЛицСрезПоследних.Имя + " " + ФИОФизическихЛицСрезПоследних.Отчество, ВТ_Док.Сотрудник.Наименование) КАК ФИО
ИЗ ВТ_Док КАК ВТ_Док
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Должность КАК ВТ_Должность
ПО ВТ_Док.Сотрудник =ВТ_Должность.Сотрудник
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОФизическихЛицСрезПоследних
ПО ВТ_Док.Сотрудник.ФизическоеЛицо = ФИОФизическихЛицСрезПоследних.ФизическоеЛицо
УПОРЯДОЧИТЬ ПО ФИО
ПоказатьЕсли же принципиально, то необходимо добавить ограничение на дату документа, чтобы занимаемая
должность/подразделение из регистра "ДанныеДляПодбораСотрудников" бралась не позже, скорее всего по периоду.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот