Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите как переписать запрос 
:(
    Опции темы
senglory
  Дата 15.9.2017, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 15.9.2017

Репутация: нет
Всего: нет



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


Но мне сказали что есть решение лучше. Что-то не пойму как оно выглядит. Подскажите, плиз.
PM MAIL   Вверх
boevik
Дата 16.9.2017, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: 15
Всего: 35



Можно попроще.
Для начало найдем работников которые участвовали в более 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


Это сообщение отредактировал(а) boevik - 16.9.2017, 10:34


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Akina
Дата 18.9.2017, 07:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



А нафига тут подзапрос?
Код

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



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1090 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.