SQL Server, ссылающийся на вложенные подзапросы - PullRequest
0 голосов
/ 13 февраля 2012

В базе данных сервера sql я пытаюсь вернуть гендеру больше всего денег безумных бонусов. Поэтому у меня есть подзапрос, чтобы вычислить сумму бонусов, сделанных каждым полом, другой подзапрос, чтобы вернуть максимум, и, наконец, мой основной запрос возвращает пол с этим максимумом. Однако мой код не работает.

SELECT E.Gender, maxx.mm

   FROM HumanResources.Employee as E, 
   (SELECT MAX(Bonus) as mm 
    FROM (SELECT E.Gender, SUM(SP.Bonus) AS Bonus 
          FROM HumanResources.Employee AS E, Sales.SalesPerson AS SP
          GROUP BY E.Gender) 
     AS gen) AS  maxx

, где E.Gender = gen.Gender;

Последняя строка: где E.Gender = gen.Gender, кажется, не работает как gen.Gender не может быть связан

Любая помощь, пожалуйста

Ответы [ 2 ]

1 голос
/ 13 февраля 2012

Поместите свой фильтр в подзапрос.Вы можете обращаться к внешним запросам изнутри, поэтому:

 AS gen) AS  maxx

становится

 AS gen WHERE  E.Gender = gen.Gender) AS  maxx
1 голос
/ 13 февраля 2012

Я не большой поклонник модели subquery(subquery(subquery(, так как это часто расточительно и обычно трудно анализировать / понимать / переписывать. Вот как я изначально хотел переписать его, когда увидел:

SELECT TOP (1) E.Gender, mm = SUM(SP.Bonus)
  FROM Sales.SalesPerson AS sp 
  INNER JOIN HumanResources.Employee AS E
  ON E.EmployeeID = sp.EmployeeID -- guess on relationship
GROUP BY E.Gender
ORDER BY mm DESC;

Другой способ (потенциально более эффективный в зависимости от плана, поскольку вы исключите из объединения всех, кроме одного сотрудника - что-то, что может произойти выше, но не может):

;WITH sp AS
(
  SELECT TOP 1 EmployeeID, mm = SUM(Bonus)
    FROM Sales.SalesPerson
    GROUP BY EmployeeID
    ORDER BY mm DESC
)
SELECT E.Gender, topsp.mm
  FROM sp
  INNER JOIN HumanResources.Employee AS E
  ON E.EmployeeID = sp.EmployeeID; -- again guessing on relationship
...