Левое соединение в запросе между справочником и ТЧ документов
Добрый день, прошу помощи с запросом.
Есть справочник "Сотрудники" и есть документ "Табель" с ТЧ, где фигурируют сотрудники из справочника, но не все.
Подскажите, пожалуйста, как можно вывести всех сотрудников, которые есть в документе и которые вообще ни в одном табеле не фигурирую.
Есть справочник "Сотрудники" и есть документ "Табель" с ТЧ, где фигурируют сотрудники из справочника, но не все.
Подскажите, пожалуйста, как можно вывести всех сотрудников, которые есть в документе и которые вообще ни в одном табеле не фигурирую.
ВЫБРАТЬ
Сотрудники.Ссылка КАК Ссылка,
Сотрудники.Код КАК Код,
ТабельСписок.ФИО КАК ФИО,
Сотрудники.Должность КАК Должность,
ТабельСписок.ДатаДок КАК ДатаДок,
ЕСТЬNULL(ТабельСписок.День1, 0) КАК День1,
ЕСТЬNULL(ТабельСписок.День2, 0) КАК День2,
ЕСТЬNULL(ТабельСписок.День3, 0) КАК День3,
ЕСТЬNULL(ТабельСписок.День4, 0) КАК День4,
ЕСТЬNULL(ТабельСписок.День5, 0) КАК День5,
ЕСТЬNULL(ТабельСписок.День6, 0) КАК День6,
ЕСТЬNULL(ТабельСписок.День7, 0) КАК День7,
ЕСТЬNULL(ТабельСписок.День8, 0) КАК День8,
ЕСТЬNULL(ТабельСписок.День9, 0) КАК День9,
ЕСТЬNULL(ТабельСписок.День10, 0) КАК День10,
ЕСТЬNULL(ТабельСписок.День11, 0) КАК День11,
ЕСТЬNULL(ТабельСписок.День12, 0) КАК День12,
ЕСТЬNULL(ТабельСписок.День13, 0) КАК День13,
ЕСТЬNULL(ТабельСписок.День14, 0) КАК День14,
ЕСТЬNULL(ТабельСписок.День15, 0) КАК День15,
ЕСТЬNULL(ТабельСписок.День16, 0) КАК День16,
ЕСТЬNULL(ТабельСписок.День17, 0) КАК День17,
ЕСТЬNULL(ТабельСписок.День18, 0) КАК День18,
ЕСТЬNULL(ТабельСписок.День19, 0) КАК День19,
ЕСТЬNULL(ТабельСписок.День20, 0) КАК День20,
ЕСТЬNULL(ТабельСписок.День21, 0) КАК День21,
ЕСТЬNULL(ТабельСписок.День22, 0) КАК День22,
ЕСТЬNULL(ТабельСписок.День23, 0) КАК День23,
ЕСТЬNULL(ТабельСписок.День24, 0) КАК День24,
ЕСТЬNULL(ТабельСписок.День25, 0) КАК День25,
ЕСТЬNULL(ТабельСписок.День26, 0) КАК День26,
ЕСТЬNULL(ТабельСписок.День27, 0) КАК День27,
ЕСТЬNULL(ТабельСписок.День28, 0) КАК День28,
ЕСТЬNULL(ТабельСписок.День29, 0) КАК День29,
ЕСТЬNULL(ТабельСписок.День30, 0) КАК День30,
ЕСТЬNULL(ТабельСписок.День31, 0) КАК День31
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Табель.Список КАК ТабельСписок
ПО Сотрудники.Ссылка = ТабельСписок.ФИО.Ссылка
ГДЕ
Сотрудники.ДатаУвольнения <> НЕОПРЕДЕЛЕНО
И ТабельСписок.ДатаДок = &ДатаДок
УПОРЯДОЧИТЬ ПО
Код
ПоказатьПо теме из базы знаний
- Обработка отчетов Моспаркинга в КА 1.1 с учетом путевых листов из УАТ 1.0
- Пример создания кадрового отчета для ЗУП 3.1
- Распространенные ошибки разработчиков, приводящие к проблемам производительности
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Диадок. Добавление документа Передача товаров между организациями в УТ 11
Найденные решения
(3)
Перенесите
в условия соединения таблиц
ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.
Значит, все имеющиеся сотрудники в справочнике, задействованы в ТЧ документа, т.к. отбор по дате документа превращает левое соединение во внутреннее.
Смена таблиц в запросе результат не изменила
Перенесите
И ТабельСписок.ДатаДок = &ДатаДок
в условия соединения таблиц
Сотрудники.ДатаУвольнения <> НЕОПРЕДЕЛЕНО
ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.
а добавление отбора вообще выдает пустую таблицу
Значит, все имеющиеся сотрудники в справочнике, задействованы в ТЧ документа, т.к. отбор по дате документа превращает левое соединение во внутреннее.
Остальные ответы
В избранное
Подписаться на ответы
Сортировка:
Древо развёрнутое
Свернуть все
(3)
Перенесите
в условия соединения таблиц
ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.
Значит, все имеющиеся сотрудники в справочнике, задействованы в ТЧ документа, т.к. отбор по дате документа превращает левое соединение во внутреннее.
Смена таблиц в запросе результат не изменила
Перенесите
И ТабельСписок.ДатаДок = &ДатаДок
в условия соединения таблиц
Сотрудники.ДатаУвольнения <> НЕОПРЕДЕЛЕНО
ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.
а добавление отбора вообще выдает пустую таблицу
Значит, все имеющиеся сотрудники в справочнике, задействованы в ТЧ документа, т.к. отбор по дате документа превращает левое соединение во внутреннее.
(1)
И это условие тоже лучше заранее до соединения.
ГДЕ
Сотрудники.ДатаУвольнения <>...
Сотрудник может работать в текущем месяце и быть уволен в текущем месяце. А может быть не принят ещё в текущем месяце. Может быть принят в следующем. Или не принят совсем. Условие должно быть совсем иное и не только на дату увольнения.
Сотрудники.ДатаУвольнения <>...
И это условие тоже лучше заранее до соединения.
(3)попробуйте такое условие
(зачем все дни выводить? не понятно)
попробуйте убрать дни, вам же сам факнт наличия табеля проверить нужно?
и условие поменяйте
(зачем все дни выводить? не понятно)
попробуйте убрать дни, вам же сам факнт наличия табеля проверить нужно?
и условие поменяйте
ГДЕ
ИЗ
Справочник.Сотрудники КАК Сотрудники
ЛЕВОЕ СОЕДИНЕНИЕ Документ.Табель.Список КАК ТабельСписок
ПО Сотрудники.Ссылка = ТабельСписок.ФИО.Ссылка
И ТабельСписок.ДатаДок = &ДатаДок //перенесено в соединение
ГДЕ
Сотрудники.ДатаУвольнения = ДатаВремя(1,1,1) //все НЕ уволенные
УПОРЯДОЧИТЬ ПО
Код
Показать
(11) С логикой все нормально.
1) Вы допускаете, что может быть создано несколько табелей и один из сотрудников не будет протабелирован?
2) Сотрудник может работать два дня, а дальше заболеть, уйти в отпуск, отсутствовать одним словом, таких тоже нужно видеть, но нужно видеть, что он работал эти два дня.
3) Я уже написал в (4), повторяться не буду.
1) Вы допускаете, что может быть создано несколько табелей и один из сотрудников не будет протабелирован?
2) Сотрудник может работать два дня, а дальше заболеть, уйти в отпуск, отсутствовать одним словом, таких тоже нужно видеть, но нужно видеть, что он работал эти два дня.
3) Я уже написал в (4), повторяться не буду.
(15)
Эти пункты про разных сотрудников, единственное в чем согласен, это в том, что сотрудник либо есть в табеле, либо его нет.
Суть претензии какая? Стартмани за бестолковый диалог, да и вообще за диалог не начисляются.
а ты не допускаешь, что у тебя пункты 1 и 2 противоречат друг другу?
Эти пункты про разных сотрудников, единственное в чем согласен, это в том, что сотрудник либо есть в табеле, либо его нет.
Суть претензии какая? Стартмани за бестолковый диалог, да и вообще за диалог не начисляются.
(13)
Ну, и самый распространенный пример, который приводят. Сотрудник отработал с утра, а вечером после работы попал в больницу. БЛ выписали с даты попадания в мед учреждение. Вопрос - будет ли ему оплачен этот день и должен ли быть оплачен?
Поэтому с табелями можно допускать всё что угодно.
По сути запроса. Прежде чем соединять табель правильнее ограничить соединяемую таблицу: В вашем случае сначала соединяются две большие таблицы, а потом по условию соединения отрубаются не нужные записи. Можно же соединять вторую таблицу в гораздо меньшем объеме. SQL конечно умный и по факту скорее всего так и сделает, но не факт.
1) Вы допускаете, что может быть создано несколько табелей и один из сотрудников не будет протабелирован?
2) Сотрудник может работать два дня, а дальше заболеть, уйти в отпуск, отсутствовать одним словом, таких тоже нужно видеть, но нужно видеть, что он работал эти два дня.
Смотря какая конфигурация. Сталкивался с конфигурациями, где по сотруднику можно ввести несколько табелей. Табеля вводят табельщики. И каждому табельщику фиолетово где ещё сотрудник в этом месяце табелировался. Он отвечает только за свою работу. Далее табеля складываются и сумма табелей это фактический табель. Плановое время считается отдельно.
2) Сотрудник может работать два дня, а дальше заболеть, уйти в отпуск, отсутствовать одним словом, таких тоже нужно видеть, но нужно видеть, что он работал эти два дня.
Ну, и самый распространенный пример, который приводят. Сотрудник отработал с утра, а вечером после работы попал в больницу. БЛ выписали с даты попадания в мед учреждение. Вопрос - будет ли ему оплачен этот день и должен ли быть оплачен?
Поэтому с табелями можно допускать всё что угодно.
По сути запроса. Прежде чем соединять табель правильнее ограничить соединяемую таблицу:
"ТабельСписок.ДатаДок = &ДатаДок"