Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server函数返回值,如果没有结果,则返回NULL_Sql_Sql Server_Common Table Expression - Fatal编程技术网

SQL Server函数返回值,如果没有结果,则返回NULL

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

我试图创建一个标量函数,如果某个职位(jobcode此处)已填补,则该函数将返回一个员工编号;如果该职位空缺(aactive或T终止状态),则该函数将返回一个空值

我碰巧知道517店有一个叫经理(10061)的职位空缺。同一职位在536处填补。我用一个CTE来实现这一点,它阻止我在存在的地方使用
,这是我第一次尝试解决这个问题

我得到的最接近的结果是:

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