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

如何在SSRS/SQL中按人员筛选不超过指定日期的最新分配数据

嘿,我来帮你搞定这个报表需求!你要的其实是提取每个员工在指定日期前的最新分配记录——也就是只保留每个员工最后一次更新(且不晚于用户输入日期)的分配数据,对吧?下面是具体的实现方案,不管是SQL查询还是SSRS参数设置都给你安排明白:

核心思路

要实现这个需求,分两步走最清晰:

  1. 先找出每个员工(按First Name+Last Name分组)在用户输入日期之前的最大有效分配日期
  2. 再用这个日期关联回原表,取出对应的分配明细(Area和Percent)

SQL查询实现

这里我们用CTE(公共表表达式)来简化逻辑,同时支持SSRS的参数输入:

-- 注意:在SSRS里不需要DECLARE这行,直接用报表参数@ReportDate
-- DECLARE @ReportDate DATE = '2020-06-30'

-- 第一步:获取每个员工不超过指定日期的最新分配日期
WITH LatestEmployeeDates AS (
    SELECT 
        [First Name],
        [Last Name],
        MAX(Date) AS LatestAllocationDate
    FROM Allocations
    WHERE Date <= @ReportDate
    GROUP BY [First Name], [Last Name]
)

-- 第二步:关联回原表,提取对应的分配记录
SELECT 
    a.[First Name],
    a.[Last Name],
    a.Date,
    a.Area,
    a.Percent
FROM Allocations a
INNER JOIN LatestEmployeeDates led
    ON a.[First Name] = led.[First Name]
    AND a.[Last Name] = led.[Last Name]
    AND a.Date = led.LatestAllocationDate
ORDER BY a.[Last Name], a.[First Name], a.Area

适配SSRS的设置

  1. 在你的SSRS报表里创建一个日期类型的参数,命名为ReportDate,设置成允许用户输入或选择日期
  2. 将上面的SQL查询导入报表的数据集,把查询里的DECLARE行删掉,直接用@ReportDate作为参数——SSRS会自动识别这个参数并关联到你创建的报表参数上

验证示例数据

拿你给的示例数据测试的话:

  • 如果用户输入2020-06-30,查询会自动过滤掉任何晚于这个日期的记录,然后找到每个员工的最新分配日期:
    • Bob Smith的最新日期是2020-01-01(没有后续更新)
    • Jane Doe的最新日期是2020-04-01
    • Bruce Wayne的最新日期是2020-04-01
      最终返回的结果完全符合你期望的输出~

额外小提示

如果你的系统里存在同名员工(比如两个Bob Smith),建议用唯一的EmployeeID来分组,避免把不同员工的记录混在一起。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:32:48