在两个主表和一个详细信息表之间加入

时间:2012-02-23 13:30:10

标签: sql tsql

我正在使用Northwind数据库(Microsoft示例),我想知道每个地区的总销售额。 此示例的表是(Region,Territories,EmployeeTerritories,Employees,Orders和OrderDetails) 关系是:

  1. 许多地区的地区
  2. 许多EmployeeTerritories上的地区
  3. EmployeeTerritories 多对一员工
  4. 员工参加许多订单
  5. 订购一到多个OrderDetails
  6. 我知道我应该使用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。

1 个答案:

答案 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)

(同样,无法访问数据库,因此无法测试 - 但这应该过滤掉重复项。)

或者,您可以为每个区域分配一定比例的销售 - 但是,舍入可能会导致总计不能正确累加。这是我想在发布之前尝试的查询!