2017-02-17 3 views
0

Таблица Aвнутреннее соединение в MySQL

Calid |  EffectiveFrom 
--- 
2  |  10 Jun 2016 
--- 
5  |  20 Nov 2016 
------ 
7  | 05 Jan 2017 
-- 

CALID 2 должен сопровождаться человека от 10 июня года, от 20 ноября CALID 5 должен следовать и так далее ....

Таблица B содержит подробную информацию о калибровке (все рабочие даты).

Table B 
CAlid | WorkingDate 
2  | 1 Jan 2016 
2  | 2 Jan 2016 
2  | 4 Jan 2016 till 31 Dec all working dates are present 
5  | 1 Jan 2016 
5  | 2 Jan 2016 
5  | 3 Jan 2016 
5  | 5 Jan 2016 till 31 dec all working dates are present 

и т. Д. Все рабочие даты калибра 7 представлены. Отчет должен быть сгенерирован, чтобы найти общие рабочие дни для человека, который следил за калибром, как в таблице A. Отчет должен содержать такие дни, как Calid | Дата (из таблицы B). Это должно быть достигнуто с помощью оператора select (без процедуры, поскольку это часть представления). В таблице A у меня нет значения для столбца даты.


Детали: Таблица B содержит все рабочие дни (читай даты) данного года. Calid - это идентификатор календаря для определенного календаря. Say calid 2 означает список всех рабочих дней в Японии, а Calid 5 дает списки всех рабочих дней/дат в течение года в Дубае. Сотрудник перемещается в разных местах из Японии в Дубай, поэтому его/ее рабочие дни меняются соответственно. В конце года должно быть рассчитано, сколько дней должно было работать работник. Таблица A содержит историю календаря сотрудников в течение года. Запись добавляется в день, когда сотрудник переезжает в другое место и начинает следить за другим календарем местоположения. EffectiveFrom указывает дату, с которой выполняется конкретный календарь. Эта часть логики должна быть объединена с другим кодом в представлении, поэтому ограничения вида не повреждены.

Я отредактировал этот вопрос, чтобы прояснить его как комментарий @philipxy.

+0

Ваше сообщение нечеткое. Пожалуйста, используйте полные простые предложения, а не фрагменты, такие как «(все рабочие даты)» и «до 31 декабря все рабочие даты присутствуют». Мы должны * догадываться * на то, что вы пытаетесь сказать. Является ли таблица B только для 2016 года? Что это связано с A? Это информация о 2016 году, но с каждым рабочим днем? Тогда почему 2 и 5 не начинаются в июне и ноябре? Что означает «(без процедуры, поскольку это часть зрения)» означает? Зачем говорить «В таблице A у меня нет эффективной колонки даты»? - мы знаем. Также неясно, когда строка переходит в A, B или результат. И - в чем ваш вопрос? Какие части вы можете сделать? Где вы застряли? – philipxy

+0

@ KaranShah Я очень близок к тому, чтобы это сделать ... Ура! CTE - это ключ. Предоставьте окончательное обновление в понедельник. Gn. – EetSandhu

+0

Это то, что я пробовал, и он работает :) – EetSandhu

ответ

0

Наконец-то я понял! CTE

WITH Cte (EmpNo, calid, dtEffectiveDate,number)AS 
     (SELECT EmpNo, calid, dtEffectiveDate,row_number() over(order by EmpNo,dtEffectiveDate) 
       FROM TableA WHere EmpNo in (1741285) 
     ) 
     , OuterCte (EmpNo, calid, dtEffectiveDate,number,dtEffectiveToDate) As 
     (Select d.*,IsNull(d2.dteffectiveDate-1,Convert(Date,DATEADD(YEAR, DATEDIFF(YEAR,0,GETDATE()) + 2, -1))) as dtEffectiveToDate 
      from Cte d 
      left outer join Cte d2 on d.number = (d2.number-1) 
     ) 
    SELECT EmpNo,WorkingDate,WorkingDescription 
    FROM  OuterCte CAL ON ELA.EmpNo = CAL.EmpNo   
    INNER JOIN TableB HCD WITH(NOLOCK) ON HCD.calid = CAl.calid 
    AND HCD.dtHolidayDate between cal.dtEffectiveDate and cal.dtEffectiveToDate 
Смежные вопросы