如何在T-SQL查询的过滤条件中实现“小于”和“ IN”的逻辑?

时间:2019-08-26 11:33:33

标签: sql sql-server tsql

我正在使用SQL Server 2014,并且有一个名为hr_employee的表,其中包含组织中所有员工的列表。该表包含名为“状态”的列,并且只能有两个值:“工作”或“左”。它还有另外2列用于“雇用日期”和“离开日期”。

因此,如果我需要查找特定日期(例如,截至2018年7月1日)的在职员工总数,我的查询将如下所示:

USE MyDatabase

select '2018-07-01' as [As At], count (*) as [CountOfEmployees] from [hr_employee]

WHERE [Status] = 'Working'

AND [left_DT] = ''

AND [hired_DT] < '2018-07-01'

上面的查询给了我以下输出:

As At           CountOfEmployees
2018-07-01        1,550

我的问题是如何修改现有查询以获取以下输出(显示了虚拟图形):

As At           CountOfEmployees
2018-07-01        1,550
2018-08-01        1,200
2018-09-01        1,430

我被困在对值“ 2018-08-01”和“ 2018-09-01”进行硬编码并在现有代码中实现“小于”的逻辑。还是我用这种逻辑朝着错误的方向前进?

1 个答案:

答案 0 :(得分:2)

您可以使用values()列出要比较的值:

select v.dte, count(e.status) as [CountOfEmployees]
from (values (convert(date, '2019-06-01')),
             (convert(date, '2019-07-01')),
             (convert(date, '2019-08-01'))
     ) v(dte) left join
     hr_employee e
     on e.hired_DT < v.dte and
        e.Status = 'Working' and
        e.left_DT = ''
group by v.dte
order by v.dte;

如果时间较长,则可能需要使用递归CTE或数字/日历表来生成值。