Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите с запросом (число прочтений - 11265 )
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Помогите с запросом
22. Мая 2013 :: 09:56
Печать  
Надо сделать запрос к справочнику сотрудники и документам о приеме и увольнении.
Результат должен быть | сотрудник| макс дата приема | макс дата увольнения|.

Спасибо

           |SELECT $ПриказОПриеме.Сотрудник                                                      [СотрП $Справочник.Сотрудники]
           |      , $ПриказОбУвольнении.Сотрудник                                                [СотрУ $Справочник.Сотрудники]
           |      , NullIf(Max($ПриказОПриеме.ДатаПриема)                  , '17530101')      МаксимумДатаПриема
           |      , NullIf(Max($ПриказОбУвольнении.ДатаУвольнения), '17530101')      МаксимумДатаУвольнения
           |FROM $Документ.ПриказОбУвольнении AS ПриказОбУвольнении
           |      FULL JOIN $Документ.ПриказОПриеме AS ПриказОПриеме ON $ПриказОбУвольнении.Сотрудник = $ПриказОПриеме.Сотрудник
           |WHERE ($ПриказОПриеме.Сотрудник <> $ПустойИд) --ЗДЕСЬ НАДО ОТСЕИТЬ УСЛОВИЕМ ЕСЛИ МаксимумДатаПриема > МаксимумДатаУвольнения  НО ДАТА   МаксимумДатаУвольнения  <> 0
           |GROUP BY $ПриказОПриеме.Сотрудник
           |      , $ПриказОбУвольнении.Сотрудник
           |";
« Последняя редакция: 22. Мая 2013 :: 11:48 - barbitura »  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #1 - 22. Мая 2013 :: 10:00
Печать  
Делай, разрешаю.
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #2 - 22. Мая 2013 :: 11:04
Печать  
Eprst писал(а) 22. Мая 2013 :: 10:00:
Делай, разрешаю.



А подсказать как сделать? а то я уже перекрутил как мог
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #3 - 22. Мая 2013 :: 11:16
Печать  
Подсказать что ?
Больше кода.
Нам отсюда не видно, что ты делал и что не получилось.
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #4 - 22. Мая 2013 :: 12:15
Печать  
Eprst писал(а) 22. Мая 2013 :: 11:16:
Подсказать что ?
Больше кода.
Нам отсюда не видно, что ты делал и что не получилось.

   |SELECT $ПриказОПриеме.Сотрудник                                                      [СотрП $Справочник.Сотрудники]
          |      , $ПриказОбУвольнении.Сотрудник                                                [СотрУ $Справочник.Сотрудники]
          |      , NullIf(Max($ПриказОПриеме.ДатаПриема)                  , '17530101')      МаксимумДатаПриема
          |      , NullIf(Max($ПриказОбУвольнении.ДатаУвольнения), '17530101')      МаксимумДатаУвольнения
          |FROM $Документ.ПриказОбУвольнении AS ПриказОбУвольнении
          |      FULL JOIN $Документ.ПриказОПриеме AS ПриказОПриеме ON $ПриказОбУвольнении.Сотрудник = $ПриказОПриеме.Сотрудник
          |WHERE ($ПриказОПриеме.Сотрудник <> $ПустойИд) --ЗДЕСЬ НАДО ОТСЕИТЬ УСЛОВИЕМ ЕСЛИ МаксимумДатаПриема > МаксимумДатаУвольнения  НО ДАТА   МаксимумДатаУвольнения  <> 0
          |GROUP BY $ПриказОПриеме.Сотрудник
          |      , $ПриказОбУвольнении.Сотрудник
          |";
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #5 - 22. Мая 2013 :: 12:30
Печать  
Тебе нужно видеть весь справочник ? Или только из документов ДатаПриема/Увольнения ?

А так,  для начала:

Код
Выбрать все
|select
|	Спр.id as [Сотрудничек $Справочник.Сотрудники]
|	,Приём.ДатаПриема
|	,Увольнение.ДатаУвольнения
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|	 (select
|		   $ПриказОПриеме.Сотрудник as Сотрудник
|		  ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|	  from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|	  group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|	 (select
|		   $ПриказОбУвольнении.Сотрудник as Сотрудник
|		  ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|	  from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|	  group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id
|where Приём.ДатаПриема < Увольнение.ДатаУвольнения 

  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #6 - 22. Мая 2013 :: 12:46
Печать  
Надо видеть весь справочник у которых есть дата приема (дата увольнения если есть). но тут нюанс получается из-за того что у сотрудников может быть много приказов о приеме и много приказов на увольнение.

За запрос спасибо. но выдает на 400 человек меньше чем надо.

Может еще что-нибудь попробуете?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #7 - 22. Мая 2013 :: 12:50
Печать  
Сейчас выводятся только те сотрудники, у которых есть максдатПриёма, которая меньше МаксДатаУвольнения..
Т.е сотрудников с пустой датой увольнения нема (это те, которые еще не уволены).

Улыбка

Можешь так еще
Код
Выбрать все
|select
|	Спр.id as [Сотрудничек $Справочник.Сотрудники]
|	,Приём.ДатаПриема as ДатаПриема
|	,case when coalesce(Увольнение.ДатаУвольнения,'17530101')<Приём.ДатаПриема then
|	    '17530101'
|	 else Увольнение.ДатаУвольнения end as ДатаУваольнения
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|	 (select
|		   $ПриказОПриеме.Сотрудник as Сотрудник
|		  ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|	  from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|	  group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|	 (select
|		   $ПриказОбУвольнении.Сотрудник as Сотрудник
|		  ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|	  from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|	  group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id 



так должны попасть работающие сотруднички
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #8 - 22. Мая 2013 :: 12:56
Печать  
Eprst писал(а) 22. Мая 2013 :: 12:50:
Сейчас выводятся только те сотрудники, у которых есть максдатПриёма, которая меньше МаксДатаУвольнения..
Т.е сотрудников с пустой датой увольнения нема (это те, которые еще не уволены).

Улыбка


           |SELECT Прием.Сотрудник [СотрудникП $Справочник.Сотрудники]
                 |      , Увольнение.Сотрудник [СотрудникУ $Справочник.Сотрудники]
                 |      , NullIf(Max(Прием.ДатаПриема), '17530101') МаксимумДатаПриема
                 |      , NullIf(Max(Увольнение.ДатаУвольнения), '17530101') МаксимумДатаУвольнения
                 |FROM (SELECT (Журнал.CLOSED & 1) ДокументПроведён
                 |                  , NullIf($ПриказОПриеме.ДатаПриема, '17530101') ДатаПриема
                 |                  , $ПриказОПриеме.Сотрудник Сотрудник
                 |            FROM $Документ.ПриказОПриеме AS ПриказОПриеме With (NOLOCK)
                 |                  INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПриказОПриеме.IDDOC = Журнал.IDDOC
                 |            WHERE ((Журнал.CLOSED & 1) = 1)) AS Прием
                 |      INNER JOIN (SELECT (Журнал.CLOSED & 1) ДокументПроведён
                 |                  , NullIf($ПриказОбУвольнении.ДатаУвольнения, '17530101') ДатаУвольнения
                 |                  , $ПриказОбУвольнении.Сотрудник Сотрудник
                 |            FROM $Документ.ПриказОбУвольнении AS ПриказОбУвольнении With (NOLOCK)
                 |                  INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПриказОбУвольнении.IDDOC = Журнал.IDDOC
                 |            WHERE ((Журнал.CLOSED & 1) = 1)) AS Увольнение ON Прием.Сотрудник = Увольнение.Сотрудник
                 |WHERE ((Прием.Сотрудник = :Сотр)
                 |      AND (Увольнение.Сотрудник = :Сотр))
                 |GROUP BY Прием.Сотрудник
                 |      , Увольнение.Сотрудник
                 |ORDER BY Прием.Сотрудник
                 |      , Увольнение.Сотрудник
                 |";

а можете этот подредактировать запрос что бы выбирались и с пустой датой. а то забылся со всем про то что надо учитывать и проведение документа.
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #9 - 22. Мая 2013 :: 13:09
Печать  
Дык вроде  щас должен норм работать, а на счет проведенных - в подзапросе соединение с журнальчиком и на closed условие
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #10 - 22. Мая 2013 :: 13:15
Печать  
Eprst писал(а) 22. Мая 2013 :: 13:09:
Дык вроде  щас должен норм работать, а на счет проведенных - в подзапросе соединение с журнальчиком и на closed условие


неа не працуе выдает в 2 раза больше
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #11 - 22. Мая 2013 :: 13:19
Печать  
Да блин, ты мой запрос запущай, а не свой
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #12 - 22. Мая 2013 :: 13:22
Печать  
Eprst писал(а) 22. Мая 2013 :: 13:19:
Да блин, ты мой запрос запущай, а не свой


а я так и сделал.

может потому что не убраны не проведенные документы
и не отсеяны уже уволенные ДатаУв > ДатаПриема
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #13 - 22. Мая 2013 :: 13:29
Печать  
barbitura писал(а) 22. Мая 2013 :: 13:22:
Eprst писал(а) 22. Мая 2013 :: 13:19:
Да блин, ты мой запрос запущай, а не свой


а я так и сделал.

может потому что не убраны не проведенные документы
и не отсеяны уже уволенные ДатаУв > ДатаПриема


Если тебе нужно отсеить уволенных, то дату увольнения видеть не надо Улыбка
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #14 - 22. Мая 2013 :: 13:38
Печать  
УлыбкаEprst писал(а) 22. Мая 2013 :: 13:29:
barbitura писал(а) 22. Мая 2013 :: 13:22:
Eprst писал(а) 22. Мая 2013 :: 13:19:
Да блин, ты мой запрос запущай, а не свой


а я так и сделал.

может потому что не убраны не проведенные документы
и не отсеяны уже уволенные ДатаУв > ДатаПриема


Если тебе нужно отсеить уволенных, то дату увольнения видеть не надо Улыбка

Улыбка
так а как без дату увольнения??? без нее смысл теряем

ничего не понимаю
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #15 - 22. Мая 2013 :: 13:45
Печать  
          |SELECT Прием.Сотрудник [СотрудникП $Справочник.Сотрудники]
                |      , Увольнение.Сотрудник [СотрудникУ $Справочник.Сотрудники]
                |      , NullIf(Max(Прием.ДатаПриема), '17530101') МаксимумДатаПриема
                |      , NullIf(Max(Увольнение.ДатаУвольнения), '17530101') МаксимумДатаУвольнения
                |FROM (SELECT (Журнал.CLOSED & 1) ДокументПроведён
                |                  , NullIf($ПриказОПриеме.ДатаПриема, '17530101') ДатаПриема
                |                  , $ПриказОПриеме.Сотрудник Сотрудник
                |            FROM $Документ.ПриказОПриеме AS ПриказОПриеме With (NOLOCK)
                |                  INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПриказОПриеме.IDDOC = Журнал.IDDOC
                |            WHERE ((Журнал.CLOSED & 1) = 1)) AS Прием
                |      INNER JOIN (SELECT (Журнал.CLOSED & 1) ДокументПроведён
                |                  , NullIf($ПриказОбУвольнении.ДатаУвольнения, '17530101') ДатаУвольнения
                |                  , $ПриказОбУвольнении.Сотрудник Сотрудник
                |            FROM $Документ.ПриказОбУвольнении AS ПриказОбУвольнении With (NOLOCK)
                |                  INNER JOIN _1SJOURN AS Журнал With (NOLOCK) ON ПриказОбУвольнении.IDDOC = Журнал.IDDOC
                |            WHERE ((Журнал.CLOSED & 1) = 1)) AS Увольнение ON Прием.Сотрудник = Увольнение.Сотрудник
                |WHERE ((Прием.Сотрудник = :Сотр)
                |      AND (Увольнение.Сотрудник = :Сотр))
                |GROUP BY Прием.Сотрудник
                |      , Увольнение.Сотрудник
                |ORDER BY Прием.Сотрудник
                |      , Увольнение.Сотрудник
                |";

этот запрос работает только для тех сотрудниов у кого есть уже дата увольнения. (повторно принимался на работу). а почему не работает для тех у кого нет документа увольнения???????

Помоги разобратся
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #16 - 22. Мая 2013 :: 13:48
Печать  
Сам же говоришь - нужно отсеить уволенных, это означает, что нужны только работающие, разве не ?
Улыбка
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #17 - 22. Мая 2013 :: 13:51
Печать  
1. нафига тебе в селекте closed, когда в фильтре только проведенные ?
2. из-за иннер джоин вестимо - так ты отсеиваешь документы "работающих" сотрудников - тебе нужен лефт (смотри мой пример)
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #18 - 22. Мая 2013 :: 13:56
Печать  
Eprst писал(а) 22. Мая 2013 :: 13:51:
1. нафига тебе в селекте closed, когда в фильтре только проведенные ?
2. из-за иннер джоин вестимо - так ты отсеиваешь документы "работающих" сотрудников - тебе нужен лефт (смотри мой пример)


Я не очень SQL знаю по этому вот такая шляпа получается у меня
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #19 - 23. Мая 2013 :: 05:12
Печать  
Eprst

Все равно не получается у меня. Помоги пожалуйста  Плачущий
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #20 - 23. Мая 2013 :: 05:16
Печать  
Пиши запрос который есть сейчас и что в нём работает не так , как надо
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #21 - 23. Мая 2013 :: 05:24
Печать  
|select
|      Спр.id as [Сотрудничек $Справочник.Сотрудники]
|      ,Приём.ДатаПриема as ДатаПриема
|      ,case when coalesce(Увольнение.ДатаУвольнения,'17530101') < Приём.ДатаПриема then '20190101'
|       else Увольнение.ДатаУвольнения end as ДатаУвольнения
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|       (select
|               $ПриказОПриеме.Сотрудник as Сотрудник
|              ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|        from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|        group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|       (select
|               $ПриказОбУвольнении.Сотрудник as Сотрудник
|              ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|                 from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|             group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id ";      

я твой запрос и пробовал менять, но из-за нехватки серого вещества что-то не получилось.

на рисунке видно что и работающие и уволенные в списке.
а надо только работающие и проверить надо что бы документы о приеме и увольнении проведены
  

111_002.jpg ( 63 KB | Загрузки )
111_002.jpg
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #22 - 23. Мая 2013 :: 05:37
Печать  
Улыбка)))))))))))))

1.Блин, если надо "а надо только работающие "
То нафига тогда нужна тебе дата увольнения ?!!!
(о чем тебя я и говорил выше)

2. Ты не обратил внимания на дату ? Это "пустая дата". Т.е это люди, у которых есть дата приёма и нет даты увольнения - это и есть твои работающие на данный момент времени.
Видать надо заместо  '17530101' что-то еще, чтоб в типизации пусто было, а не 01.01.19


ЗЫ: а ёпт.. я увидел причину этого, замени на так:

|      ,Приём.ДатаПриема as ДатаПриема
|      ,case when coalesce(Увольнение.ДатаУвольнения,'17530101') < Приём.ДатаПриема then '17530101'
|       else Увольнение.ДатаУвольнения end as [ДатаУвольнения $Дата]
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #23 - 23. Мая 2013 :: 05:39
Печать  
Eprst писал(а) 23. Мая 2013 :: 05:37:
Улыбка)))))))))))))

1.Блин, если надо "а надо только работающие "
То нафига тогда нужна тебе дата увольнения ?!!!
(о чем тебя я и говорил выше)

2. Ты не обратил внимания на дату ? Это "пустая дата". Т.е это люди, у которых есть дата приёма и нет даты увольнения.
Видать надо заместо


бывает что у сотрудника есть дата увольнения, но потом он принят повторно. ДатаПриема > ДатаУвольнения


я вот не понимаю как откинуть уволенных
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #24 - 23. Мая 2013 :: 05:42
Печать  
barbitura писал(а) 23. Мая 2013 :: 05:39:
бывает что у сотрудника есть дата увольнения, но потом он принят повторно. ДатаПриема > ДатаУвольнения


Правильно, запрос это всё учитывает
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #25 - 23. Мая 2013 :: 05:43
Печать  
Eprst писал(а) 23. Мая 2013 :: 05:42:
barbitura писал(а) 23. Мая 2013 :: 05:39:
бывает что у сотрудника есть дата увольнения, но потом он принят повторно. ДатаПриема > ДатаУвольнения


Правильно, запрос это всё учитывает


так а на рисунке посмотри берюзовым цветом отмечено это уволенный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #26 - 23. Мая 2013 :: 05:49
Печать  
Еще раз, нафига тебе ДАТА УВОЛЬНЕНИЯ тогда, если тебе нужны только РАБОТАЮЩИЕ ?????????

У них нет даты увольнения -по определению, есть только дата приёма. (и пофик, что их раньше когда-то кто-то увольнял - раз увольнял, значит еще раньше была еще одна дата приёма, такой сотрудник не должен попадать в выборку)

Исправь свой запрос как в #22, для начала. Это ты и просил в #0, если я тебя правильно понял.
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #27 - 23. Мая 2013 :: 05:51
Печать  
Eprst писал(а) 23. Мая 2013 :: 05:49:
Еще раз, нафига тебе ДАТА УВОЛЬНЕНИЯ тогда, если тебе нужны только РАБОТАЮЩИЕ ?????????

У них нет даты увольнения -по определению, есть только дата приёма.

Исправь свой запрос как в #22, для начала. Это ты и просил в #0, если я тебя правильно понял.


так как мне получить без даты увольнения, что поменять а запросе?
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #28 - 23. Мая 2013 :: 06:00
Печать  
Код
Выбрать все
|select
|	Спр.id as [Сотрудничек $Справочник.Сотрудники]
|	,Приём.ДатаПриема as ДатаПриема
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|	 (select
|		   $ПриказОПриеме.Сотрудник as Сотрудник
|		  ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|	  from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|	  group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|	 (select
|		   $ПриказОбУвольнении.Сотрудник as Сотрудник
|		  ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|	  from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|	  group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id
|where coalesce(Увольнение.ДатаУвольнения,'17530101') = '17530101' 



можно еще и от выборки справочника избавится тогда, в этом случае.
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #29 - 23. Мая 2013 :: 06:12
Печать  
Eprst писал(а) 23. Мая 2013 :: 06:00:
Код
Выбрать все
|select
|	Спр.id as [Сотрудничек $Справочник.Сотрудники]
|	,Приём.ДатаПриема as ДатаПриема
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|	 (select
|		   $ПриказОПриеме.Сотрудник as Сотрудник
|		  ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|	  from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|	  group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|	 (select
|		   $ПриказОбУвольнении.Сотрудник as Сотрудник
|		  ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|	  from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|	  group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id
|where coalesce(Увольнение.ДатаУвольнения,'17530101') = '17530101' 



можно еще и от выборки справочника избавится тогда, в этом случае.



Работает. Спасибо.
Но если сотрудника уже есть дата увольнения и он был принят второй раз то в запрос сотрудник не попадает
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #30 - 23. Мая 2013 :: 06:14
Печать  
Ёпта, у сотрудника не может быть Даты увольнения без даты приёма по-определению, если у вас так есть - кадровичку - вон из профессии
  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #31 - 23. Мая 2013 :: 06:20
Печать  
Eprst писал(а) 23. Мая 2013 :: 06:14:
Ёпта, у сотрудника не может быть Даты увольнения без даты приёма по-определению, если у вас так есть - кадровичку - вон из профессии

Улыбка
Пример:
сотрудник принят был 1.1.2000 уволен 31.31.2008, потом заново принят с 1.1.2010 и работает по текуший момент. вот оно и получается что надо проверить даты приема и увольнения
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #32 - 23. Мая 2013 :: 06:24
Печать  
Еще раз, это всё в коде есть, ЭТО - работающий сотрудник, который попадает в выборку сейчас.
И у него, нет ДАТЫ Увольнения на данный момент


Всё, я понял что ты хочешь, на вот:

Код
Выбрать все
|select
|	Спр.id as [Сотрудничек $Справочник.Сотрудники]
|	,Приём.ДатаПриема as ДатаПриема
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|	 (select
|		   $ПриказОПриеме.Сотрудник as Сотрудник
|		  ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|	  from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|	  group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|	 (select
|		   $ПриказОбУвольнении.Сотрудник as Сотрудник
|		  ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|	  from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|	  group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id
|where case when coalesce(Увольнение.ДатаУвольнения,'17530101')<Приём.ДатаПриема then
|	    '17530101'
|	 else coalesce(Увольнение.ДатаУвольнения,'17530101') end = '17530101'  

  
Наверх
 
IP записан
 
barbitura
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 135
Зарегистрирован: 22. Мая 2013
Пол: Мужской
Re: Помогите с запросом
Ответ #33 - 23. Мая 2013 :: 06:49
Печать  
Eprst писал(а) 23. Мая 2013 :: 06:24:
Еще раз, это всё в коде есть, ЭТО - работающий сотрудник, который попадает в выборку сейчас.
И у него, нет ДАТЫ Увольнения на данный момент


Всё, я понял что ты хочешь, на вот:

Код
Выбрать все
|select
|	Спр.id as [Сотрудничек $Справочник.Сотрудники]
|	,Приём.ДатаПриема as ДатаПриема
|from
|     $Справочник.Сотрудники as Спр (nolock)
|inner join
|	 (select
|		   $ПриказОПриеме.Сотрудник as Сотрудник
|		  ,Max($ПриказОПриеме.ДатаПриема) as ДатаПриема
|	  from $Документ.ПриказОПриеме as ПриказОПриеме (nolock)
|	  group by $ПриказОПриеме.Сотрудник ) as Приём on Приём.Сотрудник = Спр.id
|left join
|	 (select
|		   $ПриказОбУвольнении.Сотрудник as Сотрудник
|		  ,Max($ПриказОбУвольнении.ДатаУвольнения) as ДатаУвольнения
|	  from $Документ.ПриказОбУвольнении as ПриказОбУвольнении (nolock)
|	  group by $ПриказОбУвольнении.Сотрудник ) as Увольнение on Увольнение.Сотрудник = Спр.id
|where case when coalesce(Увольнение.ДатаУвольнения,'17530101')<Приём.ДатаПриема then
|	    '17530101'
|	 else coalesce(Увольнение.ДатаУвольнения,'17530101') end = '17530101'  




Спасибо большое Очень довольный
  
Наверх
 
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Помогите с запросом
Ответ #34 - 23. Мая 2013 :: 06:58
Печать  
В каждый подзапрос еще только надо воткнуть inner join _1sjourn с условием на closed
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать