加入两个主和一个细节表

问题描述:

我正在与Northwind数据库(微软例子),我想知道每个地区的总销售额。 表这个例子是(地区,领土,EmployeeTerritories,雇员,订单和订单明细) 而且关系是:加入两个主和一个细节表

  1. 地区的许多领土
  2. 领土上许多EmployeeTerritories
  3. EmployeeTerritories 许多人一个员工到许多订单
  4. 订单一对多订单明细
  5. 员工

我知道我应该使用子查询,但我不知道如何。

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

请格式化的SQL,让别人可以阅读它 – Arion 2012-02-23 13:41:52

还没有把访问罗斯文现在,所以这是未经测试,但你应该明白我的意思...

没有必要获取数据有关的员工,如果你想要的是每个地区的销售。您的查询是多余的,因此...

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 

正如评论,如雇员被分配到一个以上的区域这个“双数”的销售进行讨论。在许多情况下,这是所希望的行为 - 如果您想知道某个地区的效果如何,您需要知道该地区有多少销售额,并且如果员工分配到多个地区,则这不会影响该地区的表现。

但是,这意味着如果合计所有区域,则会夸大销售额。

有两种策略可以避免这种情况。一种是将销售分配给一个地区;在评论,你说有上做出这一决定没有数据,所以你能做到这一点的“最低regionID) - 是这样的:

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) 

(同样,没有进入数据库,所以不能测试 - 但这应该筛选出重复项)

或者,您可以将销售额的一定比例分配给每个地区 - 尽管四舍五入可能会导致总计不能正确合计这是我想尝试的查询发帖之前虽然!

+0

没有错,因为EmployeeTerritories是一个裁判表和Eche地区许多地区有许多员工和一名员工。总和(OD.Quantity * OD.UnitPrice) 错误。某些订单在此连接中重复使用,当您使用总和时,它会计算重复订单 – 2012-02-23 14:17:27

+0

啊 - 好的。有没有办法将员工分配到一个地区,只有一个地区?如果没有,您的结果将会有点武断 - 您可以包含子查询以获得“最早”员工地区记录的销售额,但这可能违反业务需求... – 2012-02-23 14:22:11

+0

无法将员工分配到一个地区。我的查询计算每个员工的总销售额。并将其加入员工地区。问题是,我如何总结每个地区的总额。一个TotalSale重复为每个员工在一个地区的领土记录 – 2012-02-23 14:32:33