Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Подскажите как переписать запрос


Автор: senglory 15.9.2017, 23:42
user posted image

Вот такая база. Нужно вернуть запрос , который вернет всех работников старше 50 и участвовавших в разработке более чем 10 проектов. В выводе должны быть колонки

- Имя
- Возраст
- Дата последнего проекта (на основе ProductEmployee.Date)

Я написал так:

    

Код

select e0.Name, e0.Age, tt.Name as TheLastProduct
from Employee e0
join (
select e.ID
from Employee e
join ProductEmployee pe on pe.EmployeeID = e.ID
join Product p on p.ID = pe.ProductID
where e.Age > 50
group by e.ID
having COUNT( p.ID) > 10
) e1 on e1.ID = e0.ID
cross apply
(
select top 1 p1.ID, p1.Name from Product p1
join ProductEmployee pe2 on p1.ID = pe2.ProductID
where pe2.EmployeeID = e1.ID order by pe2.Date desc
) tt


Но мне сказали что есть решение лучше. Что-то не пойму как оно выглядит. Подскажите, плиз.

Автор: boevik 16.9.2017, 09:56
Можно попроще.
Для начало найдем работников которые участвовали в более 10 проектах и последний день:
Код

select EmployeeID, max(Date) LastDateProject
from ProductEmployee
group by e.EmployeeID
having COUNT( p.ID) > 10
 

А затем соеденим два запроса:
Код

select Name, Age, LastDateProject
from Employee e
join (select EmployeeID, max(Date) LastDateProject
from ProductEmployee
group by e.EmployeeID
having COUNT( p.ID) > 10) t on t.EmployeeID = e.ID
where Age > 50

Автор: Akina 18.9.2017, 07:50
А нафига тут подзапрос?
Код

SELECT e.name, e.age, MAX(pe.date) AS maxdate
FROM Employee e, ProductEmployee pe
WHERE pe.EmployeeID = e.ID
  AND e.Age > 50
GROUP BY e.name, e.age
HAVING COUNT( /* DISTINCT */ pe.ProductID) > 10

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)