Соединение между двумя основными и одной подробной таблицей - PullRequest
0 голосов
/ 23 февраля 2012

Я работаю с базой данных Northwind (пример Microsoft), и я хочу узнать общую продажу каждого региона.Таблицы для этого примера (Регион, Территории, EmployeeTerritories, Сотрудники, Заказы и OrderDetails) И отношения:

  1. Регион для многих Территорий
  2. Территории для многих Территорий Сотрудников
  3. EmployeeTerritories многие к одному Сотрудники
  4. Сотрудники по многим заказам
  5. Заказы один ко многим OrderDetails

я знаю, что должениспользовать подзапрос, но я не знаю, как.

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-запрос для расчета общей продажи для каждого сотрудника, но как я могу рассчитать для каждого региона.

1 Ответ

0 голосов
/ 23 февраля 2012

У вас нет доступа к 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

Как обсуждалось в комментариях, это «двойной учет» продаж, когда сотрудник назначен более чем в один регион. Во многих случаях это желаемое поведение - если вы хотите знать, насколько хорошо работает регион, вам нужно знать, сколько продаж пришло из этого региона, и если сотрудник назначен в более чем один регион, это не влияет производительность региона.

Однако это означает, что вы преувеличиваете продажи, если складываете все регионы.

Есть две стратегии, чтобы избежать этого. Один - назначить продажу только одному региону; в комментариях вы говорите, что нет данных, по которым можно принять это решение, так что вы можете сделать это по «наименьшему региону») - что-то вроде:

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)

(опять же, нет доступа к БД, поэтому не можете проверить - но это должно отфильтровать дубликаты).

В качестве альтернативы, вы можете назначить долю продаж для каждого региона - хотя тогда округление может привести к тому, что итоговые суммы не будут суммироваться должным образом. Это вопрос, который я хотел бы попробовать, прежде чем публиковать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...