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

SQL组级筛选实现:按部门过滤员工且不影响项目层级统计数据

实现方案

你之前的问题核心是部门筛选的作用范围错误,不能直接在包含项目金额统计逻辑的主查询中加部门过滤条件,否则会剔除其他部门员工的项目贡献数据,导致统计金额失真。
正确的实现逻辑是把「项目全量金额统计」和「指定部门员工筛选」拆分为两个独立的逻辑单元处理:

具体代码实现

-- 定义部门筛选参数,可根据实际需求调整参数类型、默认值
DECLARE @TargetDepartment VARCHAR(100) = 'DepartmentXYZ'

-- 1. 预计算所有项目的全部门总金额,此处完全不加部门过滤,保证统计值为全量数据
WITH ProjectTotalStats AS (
    SELECT
        ProjectID,
        ProjectName,
        SUM(WorkAmount) AS TotalProjectAmount -- 此处替换为你实际的项目金额统计逻辑
    FROM ProjectTimeEntries
    GROUP BY ProjectID, ProjectName
),
-- 2. 单独筛选目标部门的员工,以及他们参与过的项目关联关系
DeptEmployeeProjects AS (
    SELECT
        e.EmployeeID,
        e.EmployeeName,
        e.Department,
        pt.ProjectID
    FROM Employees e
    INNER JOIN ProjectTimeEntries pt ON e.EmployeeID = pt.EmployeeID
    WHERE e.Department = @TargetDepartment -- 部门筛选仅作用于员工范围,不影响项目统计
    GROUP BY e.EmployeeID, e.EmployeeName, e.Department, pt.ProjectID
)
-- 3. 关联两个结果集得到最终输出
SELECT
    dep.EmployeeName + ' -- ' + dep.Department AS EmployeeLine,
    pts.ProjectName + ' -- $' + CAST(pts.TotalProjectAmount AS VARCHAR(20)) + ' (amount from employees of all Departments)' AS ProjectLine
FROM DeptEmployeeProjects dep
INNER JOIN ProjectTotalStats pts ON dep.ProjectID = pts.ProjectID
ORDER BY dep.EmployeeName, pts.ProjectName

关键说明

  • 项目金额的所有统计逻辑都放在最前面的ProjectTotalStatsCTE中,全程不添加任何部门相关过滤条件,确保统计值是所有部门员工的总贡献。
  • 部门筛选参数仅作用于员工和员工-项目关联的查询环节,只过滤你需要展示的员工范围,不会对项目统计值产生任何影响。
  • 该方案大幅减少了不必要的数据关联和重复计算,性能表现远高于报表层过滤,可适配你提到的大数据量场景,避免SSRS崩溃问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:24:04