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 来查找sales
的sum
,这将导致运行 查询每个排。您想以一种基于集合的方式解决这个问题,这意味着您需要适当地 join
和 group
:
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
我有一个要求,我需要按 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 来查找sales
的sum
,这将导致运行 查询每个排。您想以一种基于集合的方式解决这个问题,这意味着您需要适当地 join
和 group
:
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