Sql 服务器 - 仅获取活动用户的值的 SUM()

Sql Server - Get SUM() of values for only Active Users

我有一个要求,我需要按 RegionId

获取活跃员工总数和总销售额

我的查询结果应该如下所示。

RegionId | TotalEmployees | TotalSales | Average
   1            10            100         10
   2             3             15          5

我的前端应用程序会将所有 RegionId 作为以逗号分隔的单个字符串传递,我的查询参数是 VARCHAR() 类型,输入参数将类似于 '1,2,3,4,7, 14,26',一个字符串中最多可以有 20 个区域 ID,用逗号分隔。

SELECT E.[RegionId] as RegionId
      ,COUNT(E.[EmployeeId) AS TotalEmployees
      ,(SELECT SUM([Sale])
        FROM dbo.[Sales]
        WHERE RegionId = R.[RegionId]
       ) AS TotalSales
      ,TotalSales/TotalEmployees AS Average
FROM dbo.[Employee]
JOIN [dbo].[ufn_StringSplit](@RegionIdCollection, ',') RegionId
    ON E.RegionId = CAST(RegionId.[Data] AS Varchar(5000))
WHERE E.[Active] = 1
GROUP BY E.[RegionId]

我的员工 table 结构如下所示

EmployeeId | Name | RegionId | Active
    100      Tom      2          1
    101      Jim      4          0
    103      Ben      2          1

销售额Table

 SaleId | EmployeeId| RegionId |   Sale
  1         100           2         3500
  2         101           4         2000
  3         100           2         1500

现在我的问题是,当我获取 TotalSales 时,以下查询按 RegionId 获取所有销售额,但我需要获取 Employee table[=16= 中仅由当前活跃员工完成的所有销售额]

(SELECT SUM([Sale])
 FROM dbo.[Sales]
 WHERE RegionId = R.[RegionId]
) AS TotalSales

没有理由在此处使用子select 来查找salessum,这将导致运行 查询每个排。您想以一种基于集合的方式解决这个问题,这意味着您需要适当地 joingroup

with s as
(
    select e.RegionId
          ,e.EmployeeId
          ,sum(s.Sale) as EmployeeSales
    from dbo.ufn_StringSplit(@RegionIdCollection, ',') as r
        join dbo.Employee as e
            on r.RegionId = CAST(r.[Data] AS varchar(20)) -- Do you really need 5000 characters here?
        left join dbo.Sales as s
            on r.RegionId = s.RegionId
                and e.EmployeeId = s.EmployeeId
    where e.Active = 1
    group by e.RegionId
            ,e.EmployeeId
)
select s.RegionId
      ,count(s.EmployeeId) as TotalEmployees
      ,sum(s.EmployeeSales) as TotalSales
      ,sum(s.EmployeeSales)/count(s.EmployeeId) as Average
from s
group by s.RegionId