从内部查询更新外部计数

时间:2014-10-07 14:45:45

标签: sql sql-server tsql stored-procedures

我有一个查询,它从TableA获取一个主管ID列表,并且需要查找向他们报告的所有员工,这对于简单的联接来说很容易,因为它的级别很深。

在员工记录中,我们有他们的Hiredate。

我需要更新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
  • 这将是某种类型的循环,它会为每个加入的管理器进行更新。
  • 更新TableA SET longTerm = blah,shortTerm = blah其中QID = A.QID

有什么想法吗?

更新

以下是示例结构的SQLfiddle:http://sqlfiddle.com/#!6/f3a14

使用attritionCount表格,我需要搜索Employees表格,找出报告到attritionCount.QID的人数超过一年且不到一年

2 个答案:

答案 0 :(得分:0)

根据你想要做的符合标准的员工的SUM()的声音,由主管ID汇总(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

这里重要的是你要总结案例陈述的结果。这里要小心,每个员工/主管关系只返回一行。

答案 1 :(得分: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;

编辑:根据Fiddle的更新代码。如图所示,DATEDIFF()函数的行为与我的预期略有不同,因此我在case语句中更改了条件。