名称更改SQL查询-正损耗
使用SQL Server Management Studio,我得到了一个Employee表,其中记录了员工每次发生变化时的情况,无论是it经理、薪级表等,只要发生变化,和EffectiveEndDateKey将被标记为最后一次与完整字段相关,并且下一条记录将第二天作为和EffectiveBeginDateKey 我想做的是提取一个员工在上个月更换职称之前的最后一份记录。我们的目标是,如果一名员工在一个月内改变了他们的职位,这将被视为积极的自然减员,我们试图计算出在一个月内我们会得到多少积极的自然减员。它总是上个月的,所以在where语句中,我只提取上个月的更改 请看下面: 在这个例子中,在7月4日,John Doe从一名苹果商店的店员变成了第二天的经理,因此职位发生了变化。我想要的是在乔恩的最后一天——7月,当他成为经理之前,她是一名苹果商店的店员,b/c告诉我一个有效的日期键发生了变化,导致了职位的变化 所以where语句将有一个强制转换,将effectiveEndDate键转换为日期,然后查看上个月的数据,只提取上个月7月份具有effectiveEndDate键的记录,我需要帮助的是这些记录还必须具有不同的职务 如果说有人在7月31日更换了职位,那么他们的新职位/有效开始日期是20130801,那么这仍将被视为1个正损耗,我们希望从7月31日起刷新上一个记录名称更改SQL查询-正损耗,sql,sql-server,casting,where,record,Sql,Sql Server,Casting,Where,Record,使用SQL Server Management Studio,我得到了一个Employee表,其中记录了员工每次发生变化时的情况,无论是it经理、薪级表等,只要发生变化,和EffectiveEndDateKey将被标记为最后一次与完整字段相关,并且下一条记录将第二天作为和EffectiveBeginDateKey 我想做的是提取一个员工在上个月更换职称之前的最后一份记录。我们的目标是,如果一名员工在一个月内改变了他们的职位,这将被视为积极的自然减员,我们试图计算出在一个月内我们会得到多少积极的自
有什么想法吗?您可以通过自连接来实现:
select eprev.*
from Employee e
Employee eprev
on e.EmployeeId = eprev.EmployeeId and
cast(cast(e.EffectiveBeginDateKey as varchar(255)) as datetime) =
cast(cast(eprev.EffectiveEndDateKey as varchar(255)) as datetime) + 1
where cast(cast(e.EffectiveBeginDateKey as varchar(255)) as datetime) >= dateadd(mm, -1, getdate()) and
eprev.JobTitle <> e.JobTitle;
这里的关键是将数字转换为日期时间。当格式为字符串时,YYYYMMDD很容易转换。因此,首先将字符串的数字转换为datetime。其余部分只是连接的机制。由于字符串实际上只是ISO格式yyyymmdd中的日期,您甚至不必将其转换为datetime,您只需获得上一行:
select E.EmployeeID, E.JobTitle, ENEXT.JobTitle as NextJobTitle
from Employee as E
outer apply (
select top 1 T.JobTitle
from Employee as T
where
T.EmployeeID = E.EmployeeID and
T.EffectiveEndDateKey > E.EffectiveEndDateKey
order by T.EffectiveEndDateKey asc
) as ENEXT
where
E.JobTitle <> ENEXT.JobTitle and
E.EffectiveEndDateKey >= convert(nvarchar(8), dateadd(mm, datediff(mm, 0, getdate()) - 1, 0), 112)
请参见示例考虑到您只使用了一次dateadd,也许您应该使用它而不是+1,否则您应该解释各种sql或至少sql server中的日期在内部保存为十进制数,其中1.0=1day@xanatos . . . 我使用dateadd表示月份,因为月份有不同的天数。我用-1来减去一天,因为那比较短。谢谢戈登。我能够使用您的建议进行查询。