2015-03-06 4 views
0

Я сделал запрос ниже =>SQL GROUP BY FirstName, Lastname и год

SELECT FirstName, 
     LastName, 
     COUNT(*) AantalBestellingen, 
     YEAR(Orders.OrderDate) as Jaar 
from Employees 
    RIGHT JOIN Orders ON (Employees.EmployeeID=Orders.EmployeeID) 
WHERE Employees.ReportsTo IS NOT NULL 
GROUP BY Employees.FirstName, Employees.LastName, YEAR (Orders.OrderDate) 
ORDER BY YEAR (Orders.OrderDate) 

Мне нужно, чтобы выбрать имя, фамилия от сотрудников и общего количества заказов, которые они обрабатываются в течение последнего года.

После добавления группы по году к запросу он больше не показывает уникальных сотрудников, но показывает годы. Мне нужно получить только уникальных сотрудников, а в последний год заказа они обработали заказ.

Любой совет, что я делаю неправильно?

+0

В чем цель с ПРАВИЛЬНОЙ СОЕДИНЕННОСТЬю в сочетании с "WHERE Employees.ReportsTo IS NULL"? Разве это не делает его регулярным INNER JOIN?!? – jarlh

+1

Вы говорите: «Мне нужно выбрать первое имя, фамилию от сотрудников и общие заказы, которые они обработали за последний год», и 2) «Мне нужно получить только уникальных сотрудников и последний год заказа, который у них есть обработал заказ в. " Это два разных запроса, которые вы хотите? – jarlh

ответ

1

Один из способов сделать это с внутренним выбором:

SELECT 
    FirstName, 
    LastName, 
    COUNT(*) as AantalBestellingen, 
    (select YEAR(max(Orders.OrderDate)) from Orders O 
     where Employees.EmployeeID=O.EmployeeID) as Jaar 
from 
    Employees 
    RIGHT JOIN Orders 
    ON (Employees.EmployeeID=Orders.EmployeeID) 
    WHERE 
    Employees.ReportsTo IS NOT NULL 
GROUP BY 
    Employees.FirstName, 
    Employees.LastName 
ORDER BY Jaar 
0

Вы можете поместить Последнее условие в год ИНЕК следующего

SELECT FirstName, 
     LastName, 
     COUNT(*) AantalBestellingen, 
from Employees 
    RIGHT JOIN Orders ON (Employees.EmployeeID=Orders.EmployeeID) 
WHERE Employees.ReportsTo IS NOT NULL AND YEAR(Orders.OrderDate) = 2014 
GROUP BY Employees.FirstName, Employees.LastName 
0

Вы можете попробовать это ... Это даст весь сотрудник, его единственный счет в прошлом году и в прошлом году.

;with cteMaxYear as 
(select max(YEAR(Orders.OrderDate)) MaxOrderYear, EmployeeID 
from Orders 
group by EmployeeID) 

SELECT FirstName, 
     LastName, 
     COUNT(*) AantalBestellingen, 
     m.MaxOrderYear as Jaar 
from Employees e 
left outer join cteMaxYear m 
    inner join Orders o ON m.EmployeeID=o.EmployeeID and m.MaxOrderYear=o.YEAR(Orders.OrderDate) 
    on e.EmployeeID = m.EmployeeID 
WHERE e.ReportsTo IS NOT NULL 
GROUP BY e.FirstName, e.LastName, m.MaxOrderYear 
ORDER BY m.MaxOrderYear 
Смежные вопросы