我正在使用Northwind数据库(Microsoft示例),我想知道每个地区的总销售额。 此示例的表是(Region,Territories,EmployeeTerritories,Employees,Orders和OrderDetails) 关系是:
我知道我应该使用Sub查询,但我不知道如何。
select
*
from
Region R
inner join Territories T
on R.RegionID=T.RegionID
inner join EmployeeTerritories ET
on T.TerritoryID=ET.TerritoryID
inner join
(
select
E.EmployeeID,
E.FirstName,
E.LastName,
sum(OD.Quantity*OD.UnitPrice) as TotalEmployeeSale
from
Employees E
inner join Orders O
on E.EmployeeID=o.EmployeeID
inner join [Order Details] OD
on o.OrderID=OD.OrderID
Group by
E.EmployeeID,
E.FirstName,
E.LastName
)as ES on ET.EmployeeID=ES.EmployeeID
我使用此sql查询来计算每个员工的总销售额,但我如何才能为每个地区提供Caclulate。
答案 0 :(得分:0)
目前还没有访问Northwind,所以这是未经测试的,但你应该明白这一点......
如果您想要的只是每个地区的销售额,则无需获取有关员工的数据。因此,您的子查询是多余的......
select
r.RegionDescription,
sum(OD.Quantity*OD.UnitPrice)
from
Region R
inner join Territories T
on R.RegionID=T.RegionID
inner join EmployeeTerritories ET
on T.TerritoryID=ET.TerritoryID
inner join Employees E
on ET.EmployeeID=E.EmployeeID
inner join Orders O
on E.EmployeeID=o.EmployeeID
inner join [Order Details] OD
on o.OrderID=OD.OrderID
Group by r.RegionDescription
正如评论中所讨论的那样,这种“双重计数”销售将员工分配到多个地区。在许多情况下,这是理想的行为 - 如果您想知道某个地区的运作情况,您需要知道该地区有多少销售额,如果员工被分配到多个地区,则不会影响该地区的表现。
但是,如果您将所有区域相加,则意味着您夸大了销售额。
有两种策略可以避免这种情况。一种是将销售分配给一个地区;在评论中,你说没有关于做出决定的数据,所以你可以在“最低区域ID”上做到 - 比如:
select
r.RegionDescription,
sum(OD.Quantity*OD.UnitPrice)
from
Region R
inner join Territories T
on R.RegionID=T.RegionID
inner join EmployeeTerritories ET
on T.TerritoryID=ET.TerritoryID
inner join Employees E
on ET.EmployeeID=E.EmployeeID
inner join Orders O
on E.EmployeeID=o.EmployeeID
inner join [Order Details] OD
on o.OrderID=OD.OrderID
Group by r.RegionDescription
having et.TerritoryID = min(territoryID)
(同样,无法访问数据库,因此无法测试 - 但这应该过滤掉重复项。)
或者,您可以为每个区域分配一定比例的销售 - 但是,舍入可能会导致总计不能正确累加。这是我想在发布之前尝试的查询!