You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于SQL Server 2016实现当月在职员工统计及未来六个月预测的技术求助

解决SQL Server 2016中生成当月在职员工统计及未来6个月预测的问题

你的需求其实可以通过递归CTE生成日期序列+预存当月统计结果的方式来实现,比WHILE循环更高效简洁,也能避免你之前遇到的语法和结果集问题。先说说你原代码里的几个问题:

  • WHILE循环里的INNER JOIN后面没有关联表,属于语法错误;
  • 每次循环都重新查询Employees表,不仅重复计算,还会返回多个独立的结果集,而不是合并成一个你需要的表;
  • 原统计语句没有添加筛选"当月在职员工"的条件(比如入职日期早于当月初、离职日期晚于当月末或未离职),这部分需要你根据实际业务逻辑补充。

下面是完整的可运行解决方案:

-- 定义变量:替换成你的实际给定日期
DECLARE @InitialDate DATE = '2021-04-01'; -- 当月第一天
DECLARE @FinalDate DATE = DATEADD(MONTH, 6, @InitialDate); -- 加6个月后的日期

-- 1. 生成从当月到未来6个月的所有月份起始日期序列
WITH DateSequence AS (
    SELECT @InitialDate AS MonthStart
    UNION ALL
    SELECT DATEADD(MONTH, 1, MonthStart)
    FROM DateSequence
    WHERE MonthStart < @FinalDate
),
-- 2. 统计当月的在职员工数量(按Location分组)
CurrentMonthActive AS (
    SELECT 
        Emp.Location AS Location, 
        COUNT(Emp.EmpID) AS Total_Active
    FROM Employees Emp
    -- 关键:添加筛选当月在职员工的条件(根据你的实际业务调整)
    WHERE 
        Emp.HireDate <= @InitialDate -- 入职日期不晚于当月初
        AND (Emp.TerminationDate IS NULL OR Emp.TerminationDate > EOMONTH(@InitialDate)) -- 未离职或离职日期晚于当月末
    GROUP BY Emp.Location
)
-- 3. 交叉连接日期序列和当月统计结果,生成最终输出
SELECT 
    CONCAT(YEAR(ds.MonthStart), '.', FORMAT(ds.MonthStart, '00')) AS Date_Active,
    cma.Location,
    cma.Total_Active,
    CASE WHEN ds.MonthStart = @InitialDate THEN 'No' ELSE 'Yes' END AS Forecast
FROM DateSequence ds
CROSS JOIN CurrentMonthActive cma
ORDER BY cma.Location, ds.MonthStart;

代码说明:

  • DateSequence:用递归CTE生成连续的月份日期,从@InitialDate开始,直到@FinalDate前一个月(因为要包含未来6个月,所以循环条件是MonthStart < @FinalDate);
  • CurrentMonthActive:一次性统计当月各Location的在职员工数,避免重复计算;
  • 最终SELECT:通过交叉连接把每个Location的当月数据和所有生成的月份绑定,用CASE区分当月(Forecast='No')和预测月份(Forecast='Yes'),同时格式化日期为YYYY.MM的格式。

这样运行后就能得到你需要的结果,和你给出的示例格式完全一致。

内容的提问来源于stack exchange,提问作者InCeFa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:47:36