2014-10-07 6 views
0

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

В записи сотрудника у нас есть их Наем.

Мне нужно обновить TableA с учетом количества людей, которые были там более 1 года и менее 1 года.

IF(DATEDIFF(day,Hiredate,GETDATE())>365) было бы, как я думаю, мы это сделаем. Просто добавьте 1 к прилавку для каждого за 1 год и 1 к прилавку для каждого под 1 год.

Проблема с этим - я понятия не имею, с чего начать. У меня есть запрос, который присоединяется к таблицам и переходит к списку сотрудников, но не уверен, как структурировать оператор case/update.

SELECT A.[QID], B.[FirstName], B.[LastName], B.[EmpID], 
    (
     SELECT FirstName, LastName, HireDate 
     FROM dbo.EmpTable 
     WHERE SupEmpID = B.EmpID 
     FOR XML PATH ('data'), TYPE, ELEMENTS, ROOT ('root') 
     -- IF(DATEDIFF(day,Hiredate,GETDATE())>365) add +1 to longTerm var else add +1 to shortTerm var 
    ) 
FROM dbo.attritionCounts AS A 
JOIN empTable AS B ON A.QID = B.QID 
  • Это было бы в какой-то тип цикла, который обновляет в менеджере он присоединяется.
  • Update TableA SET LONGTERM = бла, бла = краткосрочные, где QID = A.QID

Любые идеи?

Update:

Вот SQLfiddle из примера структуры: http://sqlfiddle.com/#!6/f3a14

с помощью attritionCount таблицы, мне нужно искать Employees таблицу и выяснить число людей, доложить attritionCount.QID, что были здесь более года и менее года

+2

Можете ли вы добавить примеры данных и свой желаемый результат, чтобы уточнить свой вопрос, пожалуйста? – Tanner

+0

мой ответ обновлен, чтобы отобразить тестовые данные sql-скрипта. Хотя это практически не изменилось ... – mrmillsy

ответ

0

Что-то вроде этого, если я вас правильно понял:

update ac set ShortTerm = isnull(sq.ShortTerm, 0), LongTerm = isnull(sq.LongTerm, 0) 
from dbo.AttritionCount ac 
    left join (
    select e.Supervisor, 
     sum(case when dateadd(year, 1, e.HireDate) <= getdate() then 1 else 0 end) as [LongTerm], 
     sum(case when dateadd(year, 1, e.HireDate) > getdate() then 1 else 0 end) as [ShortTerm] 
    from dbo.Employees e 
    group by e.Supervisor 
) sq on sq.Supervisor = ac.QID; 

EDIT: обновленный код в соответствии с Fiddle. Как представляется, функция DATEDIFF() ведет себя несколько иначе, чем я ожидал, поэтому я изменил условия в инструкциях case.

+0

Единственное, что я не понимаю, это строка 'sq на sq.ManagerId = m.Id;' где 'sq' определяется как таблица? – SBB

+0

Квадрат сокращен для «подзапроса». Это запрос, в котором выполняется агрегирование и суммирование. – mrmillsy

+0

Хорошо, я попробовал, и я немного смущен; Возможно, я просто приспособил его неправильно, но он поставил 1 во всех долгосрочных полях, что является правильным, потому что они на протяжении года. Тем не менее, он только ставит один, даже несмотря на то, что у каждого менеджера есть 15 человек. Моя таблица сотрудников должна получить всех сотрудников, где «MgrQID = m.QID» – SBB

0

Из звуков вещей, которые вы хотите сделать SUM() сотрудников, которые соответствуют критериям, агрегированные (GROUPED) идентификатором супервизора.

Предполагая, что это так, вот пример использования условного оператора в функции агрегации, основываясь на моем понимании дела вы при условии:

CREATE TABLE #Employees 
    ([QID] varchar(9), [First] varchar(9), [Last] varchar(10), [HireDate] Date, [Supervisor] varchar(6), [Title] varchar(10)) 
; 

INSERT INTO #Employees 
    ([QID], [First], [Last], [HireDate], [Supervisor], [Title]) 
VALUES 
    ('Q12345', 'Nicole', 'Bartlett', '2014-11-07', NULL, 'President'), 
    ('Q92019', 'Christine', 'Rubio', '2014-11-07', 'Q12345', 'VP'), 
    ('Q24285', 'Pablo', 'Werner', '2014-10-07', 'Q92019', 'Director'), 
    ('Q32422', 'Holly', 'Fernandez', '2014-11-07', 'Q92019', 'Director'), 
    ('Q78841', 'Chadwick', 'Trevino', '2014-11-07', 'Q32422', 'Manager') 
; 



CREATE TABLE #attritionCount 
    ([QID] varchar(9), [shortTerm] INT, [LongTerm] INT) 
; 

INSERT INTO #attritionCount (QID, shortTerm, longTerm) 
    SELECT 
    sup.QID 
    ,SUM(CASE WHEN emp.HireDate >= DATEADD(YEAR, -1, GETDATE()) THEN 1 ELSE 0 END) 
    ,SUM(CASE WHEN emp.HireDate < DATEADD(YEAR, -1, GETDATE()) THEN 1 ELSE 0 END) 
    FROM #Employees emp 
    INNER JOIN #Employees sup ON emp.Supervisor = sup.QID 
    GROUP BY sup.QID 

SELECT * FROM #attritionCount 

Важным здесь является то, что вы» суммируя результат утверждения case. Будьте внимательны, если вы возвращаете только одну строку на отношения между сотрудниками и наблюдателями.

Смежные вопросы