Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/11.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查询无活动雇用的禁用用户_Sql_Sql Server - Fatal编程技术网

SQL查询无活动雇用的禁用用户

SQL查询无活动雇用的禁用用户,sql,sql-server,Sql,Sql Server,与我们所有的用户和他们的工作人员建立一张表格 当某人重新就业时,将为该就业期添加一个新行。 用户名将始终保持不变 试图找出最佳方法来查找哪些用户是禁用的,哪些用户没有积极的工作。数据库是SQL Server 2016 示例表: | username | name | active | enddate +-----------+-----------+--------+---------- | 1111 | Jane Doe | 1 | 1/3/2022 | 1

与我们所有的用户和他们的工作人员建立一张表格

当某人重新就业时,将为该就业期添加一个新行。 用户名将始终保持不变

试图找出最佳方法来查找哪些用户是禁用的,哪些用户没有积极的工作。数据库是SQL Server 2016

示例表:

|  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