Как запросом получить периоды действия доп. тарифа?

1. eLeMeNtaLe 07.08.24 11:25 Сейчас в теме
Коллеги, добрый день!
Может кто решал подобные задачи? Подскажите, как запросом получить периоды действия доп. тарифа у сотрудника? Во вложении пример исходной таблицы регистра и то что нужно получить в результате запроса.
Прикрепленные файлы:
По теме из базы знаний
Найденные решения
9. eLeMeNtaLe 12.08.24 11:11 Сейчас в теме
В итоге получилось как то так.
ВЫБРАТЬ
	Таблица1.Сотрудник КАК Сотрудник,
	Таблица1.УсловияТруда КАК УсловияТруда,
	МИНИМУМ(Таблица1.Период) КАК ПериодНачало,
	Таблица2.Период КАК ПериодОкончание
ИЗ
	РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица1
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица3
		ПО Таблица1.Сотрудник = Таблица3.Сотрудник
			И Таблица1.УсловияТруда = Таблица3.УсловияТруда
			И (Таблица3.Период = ДОБАВИТЬКДАТЕ(Таблица1.Период, ДЕНЬ, -1))
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица2
		ПО Таблица1.Сотрудник = Таблица2.Сотрудник
			И Таблица1.УсловияТруда = Таблица2.УсловияТруда
			И (Таблица2.Период В
				(ВЫБРАТЬ
					МИНИМУМ(Н.Период)
				ИЗ
					РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н
						ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н1
						ПО
							Н.Сотрудник = Н1.Сотрудник
								И Н.УсловияТруда = Н1.УсловияТруда
								И Н1.Период = ДОБАВИТЬКДАТЕ(Н.Период, ДЕНЬ, 1)
				ГДЕ
					Н.Период >= Таблица1.Период
					И Н.Сотрудник = Таблица1.Сотрудник
					И Н.УсловияТруда = Таблица1.УсловияТруда
					И Н1.Период ЕСТЬ NULL))
ГДЕ
	НЕ Таблица1.УсловияТруда = ЗНАЧЕНИЕ(Справочник.УсловияТруда.ПустаяСсылка)
	И Таблица1.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
	И Таблица1.Организация = &Организация

СГРУППИРОВАТЬ ПО
	Таблица1.Сотрудник,
	Таблица1.УсловияТруда,
	Таблица2.Период
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Lenten 26 07.08.24 11:51 Сейчас в теме
из исходной таблицы надо создать

1)отдельную таблицу для определения даты начала действия тарифа

группировки сотрудник, условия труда, мин(Период)

2)1)отдельную таблицу для определения даты окончания действия тарифа

группировки сотрудник, условия труда, Макс(Период)

3) итоговую таблицу из первых 2х. Там берем Сотрудник, условия труда , начало из 1 таблицы, конец из 2 таблицы
3. Lenten 26 07.08.24 11:54 Сейчас в теме
если возможен вариант, при котором тарифы меняются туда сюда несколько раз (т.е. начал действия может быть несколько), то я рекомендовал бы просто в коде таблицу анализировать, а не запросом.
4. eLeMeNtaLe 07.08.24 11:57 Сейчас в теме
(3) В том то и сложность, что за выбранный период будет несколько дат начала и несколько дат конца по одному и тому же сотруднику, с одним и тем же условием труда.
5. Lenten 26 07.08.24 12:08 Сейчас в теме
6. Said-We 07.08.24 13:45 Сейчас в теме
(4) Можно и запросом.
Сначала для каждой строки определи предыдущее значение (предыдущую строку). Если строка значение не меняет, то можно её выкинуть. Она не нужна. Останутся только строки, которые меняют значение. Далее всё просто.
7. eLeMeNtaLe 07.08.24 14:48 Сейчас в теме
(6) Не понял что требуется, можно поподробней?
9. eLeMeNtaLe 12.08.24 11:11 Сейчас в теме
В итоге получилось как то так.
ВЫБРАТЬ
	Таблица1.Сотрудник КАК Сотрудник,
	Таблица1.УсловияТруда КАК УсловияТруда,
	МИНИМУМ(Таблица1.Период) КАК ПериодНачало,
	Таблица2.Период КАК ПериодОкончание
ИЗ
	РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица1
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица3
		ПО Таблица1.Сотрудник = Таблица3.Сотрудник
			И Таблица1.УсловияТруда = Таблица3.УсловияТруда
			И (Таблица3.Период = ДОБАВИТЬКДАТЕ(Таблица1.Период, ДЕНЬ, -1))
		ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Таблица2
		ПО Таблица1.Сотрудник = Таблица2.Сотрудник
			И Таблица1.УсловияТруда = Таблица2.УсловияТруда
			И (Таблица2.Период В
				(ВЫБРАТЬ
					МИНИМУМ(Н.Период)
				ИЗ
					РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н
						ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ДанныеТабельногоУчетаРабочегоВремениСотрудников КАК Н1
						ПО
							Н.Сотрудник = Н1.Сотрудник
								И Н.УсловияТруда = Н1.УсловияТруда
								И Н1.Период = ДОБАВИТЬКДАТЕ(Н.Период, ДЕНЬ, 1)
				ГДЕ
					Н.Период >= Таблица1.Период
					И Н.Сотрудник = Таблица1.Сотрудник
					И Н.УсловияТруда = Таблица1.УсловияТруда
					И Н1.Период ЕСТЬ NULL))
ГДЕ
	НЕ Таблица1.УсловияТруда = ЗНАЧЕНИЕ(Справочник.УсловияТруда.ПустаяСсылка)
	И Таблица1.Период МЕЖДУ &ДатаНачала И &ДатаОкончания
	И Таблица1.Организация = &Организация

СГРУППИРОВАТЬ ПО
	Таблица1.Сотрудник,
	Таблица1.УсловияТруда,
	Таблица2.Период
Показать
Оставьте свое сообщение

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