我正在使用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”进行硬编码并在现有代码中实现“小于”的逻辑。还是我用这种逻辑朝着错误的方向前进?
答案 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或数字/日历表来生成值。