|
Запрос с суммированием по неполному результату | ☑ | ||
---|---|---|---|---|
0
Kraspila
05.09.14
✎
10:02
|
Задача:
На предприятии работают сотрудники. Управленческим приказом они периодически увольняются и вновь принимаются на работу. При этом перерыв в деятельности не бывает более 90 дней. Требуется: Рассчитать с помощью запроса общую продолжительность работы сотрудника в организации, при этом отбросив периоды работы, предшествующие перерыву более 90 дней. |
|||
1
Ненавижу 1С
гуру
05.09.14
✎
10:06
|
Требуется: 20'000 рублей
|
|||
2
Kraspila
05.09.14
✎
10:06
|
Суть решения сводится к отбрасыванию части запроса, где некоторое значение больше указанной величины, то есть выбираем периоды работы и количество дней после последнего увольнения,
|
|||
3
Kraspila
05.09.14
✎
10:07
|
далее отбрасываем "хвост" результатов запроса, начиная с этого
значения и до конца и суммируем полученные периоды |
|||
4
Kraspila
05.09.14
✎
10:07
|
Вот такой запрос:
ВЫБРАТЬ РаботникиОрганизаций.Период, РаботникиОрганизаций.Сотрудник.Физлицо ПОМЕСТИТЬ Увольнения ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РаботникиОрганизаций.Сотрудник.Физлицо, РаботникиОрганизаций.Период, РаботникиОрганизаций.Сотрудник ПОМЕСТИТЬ Приемы ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу) И РаботникиОрганизаций.Сотрудник.Физлицо = &Физлицо ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Приемы.СотрудникФизлицо, Приемы.Период КАК Прием, Увольнения.Период КАК Увольнение, ЕСТЬNULL(РАЗНОСТЬДАТ(Увольнения.Период, Приемы.Период, ДЕНЬ), 0.1) КАК ПрошлоДней, Приемы.Сотрудник.Код ПОМЕСТИТЬ ПериодыДней ИЗ Приемы КАК Приемы ЛЕВОЕ СОЕДИНЕНИЕ Увольнения КАК Увольнения ПО Приемы.СотрудникФизлицо = Увольнения.СотрудникФизлицо И (Увольнения.Период В (ВЫБРАТЬ МАКСИМУМ(Увольнения.Период) КАК Период ИЗ Увольнения КАК Увольнения ГДЕ Увольнения.СотрудникФизлицо = Приемы.СотрудникФизлицо И Увольнения.Период <= Приемы.Период)) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПериодыДней.Прием КАК Прием, ПериодыДней.ПрошлоДней, ПериодыДней.Увольнение ИЗ ПериодыДней КАК ПериодыДней ГДЕ ПериодыДней.ПрошлоДней > 10 УПОРЯДОЧИТЬ ПО Прием УБЫВ ; |
|||
5
Kraspila
05.09.14
✎
10:08
|
Внимание, вопрос: как отрубить результату хвост?
|
|||
6
Kraspila
05.09.14
✎
10:11
|
(1) хочет двадцатку. Предлагаю скинуться ради своего развития.
Задача была решена простой функцией, а цель темы-упражнение для ума. |
|||
7
_fvadim
05.09.14
✎
10:13
|
(6) ага-ага.
"хммм, никто кодом не поделился, придётся самому думать" |
|||
8
Kraspila
05.09.14
✎
10:17
|
ВЫБРАТЬ
РаботникиОрганизаций.Период, РаботникиОрганизаций.Сотрудник.Физлицо ПОМЕСТИТЬ Увольнения ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.Увольнение) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ РаботникиОрганизаций.Сотрудник.Физлицо, РаботникиОрганизаций.Период, РаботникиОрганизаций.Сотрудник ПОМЕСТИТЬ Приемы ИЗ РегистрСведений.РаботникиОрганизаций КАК РаботникиОрганизаций ГДЕ РаботникиОрганизаций.ПричинаИзмененияСостояния = ЗНАЧЕНИЕ(Перечисление.ПричиныИзмененияСостояния.ПриемНаРаботу) И РаботникиОрганизаций.Сотрудник.Физлицо = &Физлицо ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ Приемы.СотрудникФизлицо, Приемы.Период КАК Прием, Увольнения.Период КАК Увольнение, ЕСТЬNULL(РАЗНОСТЬДАТ(Увольнения.Период, Приемы.Период, ДЕНЬ), 0.1) КАК ПрошлоДней, Приемы.Сотрудник.Код ПОМЕСТИТЬ ПериодыДней ИЗ Приемы КАК Приемы ЛЕВОЕ СОЕДИНЕНИЕ Увольнения КАК Увольнения ПО Приемы.СотрудникФизлицо = Увольнения.СотрудникФизлицо И (Увольнения.Период В (ВЫБРАТЬ МАКСИМУМ(Увольнения.Период) КАК Период ИЗ Увольнения КАК Увольнения ГДЕ Увольнения.СотрудникФизлицо = Приемы.СотрудникФизлицо И Увольнения.Период <= Приемы.Период)) ; //////////////////////////////////////////////////////////////////////////////// ВЫБРАТЬ ПериодыДней.Прием КАК Прием, ПериодыДней.ПрошлоДней, ПериодыДней.Увольнение ИЗ ПериодыДней КАК ПериодыДней ГДЕ ПериодыДней.ПрошлоДней > 10 УПОРЯДОЧИТЬ ПО Прием УБЫВ ; |
|||
9
Kraspila
05.09.14
✎
10:21
|
Код есть, но интерес именно в том, чтоб делать запросы с суммированием, допустим, строк, только выше определенного флага
|
|||
10
Kraspila
05.09.14
✎
10:21
|
(7) Код есть, но интерес именно в том, чтоб делать запросы с суммированием, допустим, строк, только выше определенного флага
|
|||
11
Kraspila
05.09.14
✎
10:57
|
(1) Имеется 10'000 рублей
|
|||
12
Enders
05.09.14
✎
12:31
|
В чем проблема то?
1. Получаешь таблицу Сотрудник, дата приема 2. Получаешь таблицу Сотрудник, дата уволньнения 3. Соединяешь по сотрудник и датаПриема>ДатыУвольнения 4. Считаешь разницу 5. Оставляешь разницу более 90 дней 6. Группируешь по сотруднику и получаешь макс дату приема. Профит |
|||
13
Kraspila
06.09.14
✎
04:23
|
(12) Теперь вторым запросом нужно выбрать периоды работы до даты из первого запроса и сложить их. Но как выбрать периоды до даты, полученной в первом запросе?
|
|||
14
Ненавижу 1С
гуру
06.09.14
✎
07:44
|
(11) если эта сумма за решение задачи, то давай обговорим точную формулировку
|
|||
15
Enders
08.09.14
✎
16:03
|
(13) Не до, а после. в (12) Мы получили максимальную дату ПРИЕМА (то есть ту, перед которой был перерыв более 90 дней.
А что сложного? Нужные тебе таблицы соединяем по сотруднику и период >= МаксДатеПриема. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |