Переключение на Главную Страницу Страницы: [1] 2 3  ОтправитьПечать
Очень популярная тема (более 25 ответов) Помогите с запросом (число прочтений - 11149 )
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 записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 
ОтправитьПечать