2012-02-12 2 views
0

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

ВЫБОР 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 не могут быть связаны

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

+0

Можете ли вы показать образец данных и желаемых результатов? Также существует общий столбец «EmployeeID» между «Employee» и «SalesPerson»? Сейчас у вас плохое крест-соединение (две таблицы, но не предложение WHERE). –

ответ

1

Я не большой поклонник модели 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 
+0

Думаю, кому-то не нравится мой могавк. –

1

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

AS gen) AS maxx 

становится

AS gen WHERE E.Gender = gen.Gender) AS maxx 
+0

+1 Вам также нужно будет изменить список 'SELECT' от' E.Gender' до 'maxx.Gender'. Но я считаю, что вложенная вложенная модель подзапроса трудно разобрать и понять в любом случае (отсюда и мои альтернативные предложения :-)). –