Левое соединение в запросе между справочником и ТЧ документов

1. AndrewUs 11 09.06.23 14:41 Сейчас в теме
Добрый день, прошу помощи с запросом.
Есть справочник "Сотрудники" и есть документ "Табель" с ТЧ, где фигурируют сотрудники из справочника, но не все.
Подскажите, пожалуйста, как можно вывести всех сотрудников, которые есть в документе и которые вообще ни в одном табеле не фигурирую.

ВЫБРАТЬ
	Сотрудники.Ссылка КАК Ссылка,
	Сотрудники.Код КАК Код,
	ТабельСписок.ФИО КАК ФИО,
	Сотрудники.Должность КАК Должность,
	ТабельСписок.ДатаДок КАК ДатаДок,
	ЕСТЬ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
ИЗ
	Справочник.Сотрудники КАК Сотрудники
		ЛЕВОЕ СОЕДИНЕНИЕ Документ.Табель.Список КАК ТабельСписок
		ПО Сотрудники.Ссылка = ТабельСписок.ФИО.Ссылка
ГДЕ
	Сотрудники.ДатаУвольнения <> НЕОПРЕДЕЛЕНО
	И ТабельСписок.ДатаДок = &ДатаДок

УПОРЯДОЧИТЬ ПО
	Код
Показать
По теме из базы знаний
Найденные решения
7. nomad_irk 72 09.06.23 15:31 Сейчас в теме
(3)
Смена таблиц в запросе результат не изменила

Перенесите
И ТабельСписок.ДатаДок = &ДатаДок

в условия соединения таблиц

Сотрудники.ДатаУвольнения <> НЕОПРЕДЕЛЕНО

ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.

а добавление отбора вообще выдает пустую таблицу

Значит, все имеющиеся сотрудники в справочнике, задействованы в ТЧ документа, т.к. отбор по дате документа превращает левое соединение во внутреннее.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. nomad_irk 72 09.06.23 14:58 Сейчас в теме
(1)
как можно вывести всех сотрудников, которые есть в документе

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

(1)
которые вообще ни в одном табеле не фигурирую

В указанный запрос добавить отбор по:

ТабельСписок.ФИО ЕСТЬ NULL
3. AndrewUs 11 09.06.23 15:11 Сейчас в теме
(2) Смена таблиц в запросе результат не изменила, а добавление отбора вообще выдает пустую таблицу
7. nomad_irk 72 09.06.23 15:31 Сейчас в теме
(3)
Смена таблиц в запросе результат не изменила

Перенесите
И ТабельСписок.ДатаДок = &ДатаДок

в условия соединения таблиц

Сотрудники.ДатаУвольнения <> НЕОПРЕДЕЛЕНО

ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.

а добавление отбора вообще выдает пустую таблицу

Значит, все имеющиеся сотрудники в справочнике, задействованы в ТЧ документа, т.к. отбор по дате документа превращает левое соединение во внутреннее.
10. AndrewUs 11 09.06.23 15:39 Сейчас в теме
(7)Помог перенос в условие соединения, однако таблицы местами менять не стал и все заработало как хотел, спасибо.
12. AndrewUs 11 09.06.23 15:40 Сейчас в теме
(7)
ДатаУвольнения никогда не будет НЕОПРЕДЕЛЕНО, она может быть ДАТАВРЕМЯ(1, 1, 1), если интересует пустое значение.


Эту ошибку исправил, спасибо.
19. Said-We 09.06.23 18:30 Сейчас в теме
(1)
ГДЕ
Сотрудники.ДатаУвольнения <>...
Сотрудник может работать в текущем месяце и быть уволен в текущем месяце. А может быть не принят ещё в текущем месяце. Может быть принят в следующем. Или не принят совсем. Условие должно быть совсем иное и не только на дату увольнения.
И это условие тоже лучше заранее до соединения.
4. AndrewUs 11 09.06.23 15:18 Сейчас в теме
Нужно выводить всех в один список, т.е. список сотрудников, а рядом информация по табелированию, но нужно именно всех, на данный момент выходят только те, кто есть в документе табель.
5. soft_wind 09.06.23 15:23 Сейчас в теме
(3)попробуйте такое условие
(зачем все дни выводить? не понятно)
попробуйте убрать дни, вам же сам факнт наличия табеля проверить нужно?

и условие поменяйте

ГДЕ

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

УПОРЯДОЧИТЬ ПО
    Код
Показать
6. AndrewUs 11 09.06.23 15:26 Сейчас в теме
(5)
(зачем все дни выводить? не понятно)

Дни выводим, чтобы увидеть информацию по дням, т.к. сотрудник может отработать 2 дня, а потом отсутствовать оставшееся время по разным причинам.
8. user1826630 09.06.23 15:34 Сейчас в теме
(6) Так ты вроде хотел
которые есть в документе
, а не которые "работали два дня".
9. AndrewUs 11 09.06.23 15:38 Сейчас в теме
(8)Нет, хотел всех, у меня же в конце написано было: "как можно вывести всех сотрудников, которые есть в документе и которые вообще ни в одном табеле не фигурирую"
11. user1826630 09.06.23 15:39 Сейчас в теме
(9) Ну и причем тут "два дня"? Тут либо есть, либо нет. Сам для себя свою логику исправь для начала.
13. AndrewUs 11 09.06.23 15:45 Сейчас в теме
(11) С логикой все нормально.
1) Вы допускаете, что может быть создано несколько табелей и один из сотрудников не будет протабелирован?
2) Сотрудник может работать два дня, а дальше заболеть, уйти в отпуск, отсутствовать одним словом, таких тоже нужно видеть, но нужно видеть, что он работал эти два дня.
3) Я уже написал в (4), повторяться не буду.
15. user1826630 09.06.23 15:52 Сейчас в теме
(13) а ты не допускаешь, что у тебя пункты 1 и 2 противоречат друг другу?
Или ты на голубом глазу утверждаешь, что эти два дня не попадают в табель, и сотрудник остается непротабелированным??

Что-то еще?
17. AndrewUs 11 09.06.23 15:59 Сейчас в теме
(15)
а ты не допускаешь, что у тебя пункты 1 и 2 противоречат друг другу?

Эти пункты про разных сотрудников, единственное в чем согласен, это в том, что сотрудник либо есть в табеле, либо его нет.
Суть претензии какая? Стартмани за бестолковый диалог, да и вообще за диалог не начисляются.
18. Said-We 09.06.23 18:19 Сейчас в теме
(13)
1) Вы допускаете, что может быть создано несколько табелей и один из сотрудников не будет протабелирован?
2) Сотрудник может работать два дня, а дальше заболеть, уйти в отпуск, отсутствовать одним словом, таких тоже нужно видеть, но нужно видеть, что он работал эти два дня.
Смотря какая конфигурация. Сталкивался с конфигурациями, где по сотруднику можно ввести несколько табелей. Табеля вводят табельщики. И каждому табельщику фиолетово где ещё сотрудник в этом месяце табелировался. Он отвечает только за свою работу. Далее табеля складываются и сумма табелей это фактический табель. Плановое время считается отдельно.

Ну, и самый распространенный пример, который приводят. Сотрудник отработал с утра, а вечером после работы попал в больницу. БЛ выписали с даты попадания в мед учреждение. Вопрос - будет ли ему оплачен этот день и должен ли быть оплачен?
Поэтому с табелями можно допускать всё что угодно.

По сути запроса. Прежде чем соединять табель правильнее ограничить соединяемую таблицу:
"ТабельСписок.ДатаДок = &ДатаДок"
В вашем случае сначала соединяются две большие таблицы, а потом по условию соединения отрубаются не нужные записи. Можно же соединять вторую таблицу в гораздо меньшем объеме. SQL конечно умный и по факту скорее всего так и сделает, но не факт.
user1826630; +1 Ответить
14. AndrewUs 11 09.06.23 15:46 Сейчас в теме
(11) И прочитайте внимательно вопрос, на который был дан ответ про "два дня"
16. AndrewUs 11 09.06.23 15:54 Сейчас в теме
(15) Вы прочитали вопрос, на который был дан ответ про "два дня", для чего они выводятся?
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот