SQL Server函数返回值,如果没有结果,则返回NULL
我试图创建一个标量函数,如果某个职位(jobcode此处)已填补,则该函数将返回一个员工编号;如果该职位空缺(aactive或T终止状态),则该函数将返回一个空值 我碰巧知道517店有一个叫经理(10061)的职位空缺。同一职位在536处填补。我用一个CTE来实现这一点,它阻止我在存在的地方使用SQL Server函数返回值,如果没有结果,则返回NULL,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,我试图创建一个标量函数,如果某个职位(jobcode此处)已填补,则该函数将返回一个员工编号;如果该职位空缺(aactive或T终止状态),则该函数将返回一个空值 我碰巧知道517店有一个叫经理(10061)的职位空缺。同一职位在536处填补。我用一个CTE来实现这一点,它阻止我在存在的地方使用,,这是我第一次尝试解决这个问题 我得到的最接近的结果是: with cte as ( select store, empno, name, jobcode, jobtitle, status, las
,
,这是我第一次尝试解决这个问题
我得到的最接近的结果是:
with cte as (
select store, empno, name, jobcode, jobtitle, status, lasthiredate, terminationdate, row_number() over (partition by jobcode, store order by terminationdate desc) as rn
from #temp
)
Select distinct a.store, b.empno, a.name, a.jobcode, a.jobtitle, a.status, a.rn
from cte a
left outer join cte b on a.jobcode = b.jobcode and a.store = b.store and a.status <> b.status
where a.jobcode = 10061
order by a.store, a.rn
理想情况下,函数的输出是
Store | Jobcode | EmpNo
536 10061 12558412
517 10061 NULL
非常感谢您提供的任何帮助。要获得您需要的信息,您只需查看每个
存储区和作业代码的最新LastHireDate
记录即可。如果此记录的状态为'A'
,则该职位已配备人员,否则该职位为空缺
我建议使用相关子查询进行筛选,而不是行数()。在这种情况下,这可能是一个有效的解决方案,尤其是在(store、jobcode、LastHireDate)
上有一个索引
:
store | jobcode | employeeName
----: | ------: | :-----------
119 | 10721 | null
517 | 10061 | null
536 | 10061 | John S.
门店|职务代码|员工姓名
----: | ------: | :-----------
119 | 10721 |空
517 | 10061 |空
536 | 10061 |约翰S。
下面是一个标量函数:
CREATE FUNCTION dbo.CheckAvailability (@jobcode INT, @store INT)
RETURNS INT
AS
BEGIN
DECLARE @return int
SELECT @return = t.jobcode
FROM temp1 AS t
WHERE t.Jobcode = @jobcode
AND t.Store = @store
AND t.Status NOT IN ('A','T')
RETURN (@return)
END
请将您所期望的结果显示为表格文本。因此,当您有相同位置的多行时,您想考虑哪种状态?我认为您不需要标量函数或递归cte。您只需要利用行数这个标量函数接受一个jobcode作为输入,可以为null的empno作为输出?如果是这样的话,当10721被输入时,您希望得到什么输出?@gmb在上面添加了预期结果,谢谢。谢谢,我喜欢相关子查询!然而,在同一家商店可以同时招聘多个职位的情况下,筛选最长招聘日期对我来说不起作用——就像119工作代码的情况一样。你对过滤有不同的想法吗?这甚至可以用这些数据来确定,或者你有兴趣看到更多吗?在职位空缺之前,所有员工都会被解雇,因此不会返回任何行。
store | jobcode | employeeName
----: | ------: | :-----------
119 | 10721 | null
517 | 10061 | null
536 | 10061 | John S.
CREATE FUNCTION dbo.CheckAvailability (@jobcode INT, @store INT)
RETURNS INT
AS
BEGIN
DECLARE @return int
SELECT @return = t.jobcode
FROM temp1 AS t
WHERE t.Jobcode = @jobcode
AND t.Store = @store
AND t.Status NOT IN ('A','T')
RETURN (@return)
END