SQL查询无活动雇用的禁用用户
与我们所有的用户和他们的工作人员建立一张表格 当某人重新就业时,将为该就业期添加一个新行。 用户名将始终保持不变 试图找出最佳方法来查找哪些用户是禁用的,哪些用户没有积极的工作。数据库是SQL Server 2016 示例表:SQL查询无活动雇用的禁用用户,sql,sql-server,Sql,Sql Server,与我们所有的用户和他们的工作人员建立一张表格 当某人重新就业时,将为该就业期添加一个新行。 用户名将始终保持不变 试图找出最佳方法来查找哪些用户是禁用的,哪些用户没有积极的工作。数据库是SQL Server 2016 示例表: | username | name | active | enddate +-----------+-----------+--------+---------- | 1111 | Jane Doe | 1 | 1/3/2022 | 1
| username | name | active | enddate
+-----------+-----------+--------+----------
| 1111 | Jane Doe | 1 | 1/3/2022
| 1111 | Jane Doe | 0 | 1/2/2018
| 1112 | Bob Doe | 1 | NULL
| 1113 | James Doe | 0 | 1/3/2018
| 1114 | Ray Doe | 1 | NULL
| 1114 | Ray Doe | 0 | 2/2/2019
| 1115 | Emma Doe | 1 | NULL
| 1116 | Sara Doe | 0 | 3/4/2016
| 1116 | Sara Doe | 0 | 4/5/2019
理想情况下,我也希望每个用户名只获得一行,即使他们有几个工作已经结束
因此,一个查询将得到一个包含两行的列表,其中包含用户1113和1116。假设结束日期都是过去的,这应该可以工作:
select username, name
from t
group by username, name
having sum(case when enddate is null then 1 else 0 end) = 0; -- no NULL values
如果您正在寻找最大结束日期在过去且没有空结束日期的用户,则可以执行以下操作:
select username, name, max(enddate) enddate
from mytable
group by username, name
having
max(enddate) < getdate()
and max(case when enddate is null then 1 end) is null
选择用户名、名称、最大(结束日期)结束日期
从mytable
按用户名、名称分组
有
max(enddate)
你可以这样做
| username | name | active | enddate |
--------------------------------------------
| 1111 | Jane Doe | 1 |
| 1111 | Jane Doe | 0 | 1/2/2018
| 1112 | Bob Doe | 1 |
| 1113 | James Doe | 1 | **30/12/2019**
| 1114 | Ray Doe | 1 |
| 1114 | Ray Doe | 0 | 2/2/2019
| 1115 | Emma Doe | 1 |
| 1116 | Sara Doe | 0 | 3/4/2016
| 1116 | Sara Doe | 1 | **30/12/2019**
在这里,您可以创建如下查询
Select * from employee where active=1 and enddate>=getdate()
所以,活跃的员工和就业结束日期未结束的员工,我可以在上面添加的唯一内容是,您最好将用户名(name)放入查找表中,这样他们就可以保留相同的唯一键,但如果他们的姓名更改,他们在数据中保留相同的引用(例如,如果Sara Doe结婚) 使用
只返回一个结果,并且该结果是最快的结果。一种可能性是获取最大活动值。如果不是0,则表示它们处于活动状态
SELECT
username
, name
FROM dbo.YourTable
GROUP BY username
HAVING MAX(CAST(active AS INT)) = 0
与此相比,我发现其他答案很难读懂(或者没有给出你想要的答案):
SELECT DISTINCT
U.username
FROM
UserEmployment AS U
WHERE
U.active = 0 AND
NOT EXISTS (SELECT 'no current active employment'
FROM UserEmployment AS C
WHERE U.username = C.username AND
C.active = 1 AND
(C.enddate IS NULL OR C.enddate >= CONVERT(DATE, GETDATE())))
但这是个人品味。这将搜索当前没有任何活动记录的所有禁用用户
只需确保您的enddate
列实际上是DATE
而不是VARCHAR
,因为它可能会给您带来转换问题
如果您想显示所有列,但每个用户名只显示一次,那么我们必须针对已禁用的记录重新加入。我们可以通过使用
交叉应用
和顶部N
+按顺序
来控制行数:
;WITH NonActiveDisabledUsers AS
(
SELECT DISTINCT
U.username
FROM
UserEmployment AS U
WHERE
U.active = 0 AND
NOT EXISTS (SELECT 'no current active employment'
FROM UserEmployment AS C
WHERE U.username = C.username AND
C.active = 1 AND
(C.enddate IS NULL OR C.enddate >= CONVERT(DATE, GETDATE())))
)
SELECT
R.*
FROM
NonActiveDisabledUsers AS N
CROSS APPLY (
SELECT TOP 1 -- Just 1 record
U.*
FROM
UserEmployment AS U
WHERE
N.username = U.username AND
U.active = 0
ORDER BY
U.enddate DESC -- Determine which record should we display
) AS R
以下查询适用于您的解决方案:
SELECT UserName
,Name
,Max(EndDate) AS EndDate
FROM employment
GROUP BY UserName
,Name
HAVING username IN (
SELECT username
FROM Employment
WHERE active = 0
AND enddate IS NOT NULL
AND username NOT IN (
SELECT username
FROM Employment
WHERE active = 1
)
)
结果输出:
1113 James 2018-01-03
1116 Sara 2019-04-05
结束日期实际上是空的还是空的?是否要获取用户的[active]=0且[enddate]
1113 James 2018-01-03
1116 Sara 2019-04-05