我有一个查询,它从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
有什么想法吗?
更新
以下是示例结构的SQLfiddle:http://sqlfiddle.com/#!6/f3a14
使用attritionCount
表格,我需要搜索Employees
表格,找出报告到attritionCount.QID
的人数超过一年且不到一年
答案 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
语句中更改了条件。