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