От 1 до многих Выберите запрос с агрегатной функцией (база данных Adventure Works) - PullRequest
0 голосов
/ 10 апреля 2020

Я практикую свои SQL с базой данных Adventure Works. Моя задача проста. Я хочу найти сотрудника и посмотреть, сколько денег он зарабатывает.

Имя | Фамилия | Возраст | Pay Rate |

Проблема заключается в том, что ставка зарплаты находится в таблице с отношением 1 ко многим с сотрудником (EmployeePayHistory) со столбцом ModifiedDate. Я хочу взять последнюю модифицированную дату, но ничего, что я пробовал, не работает. Я продолжаю увлекаться статистической функцией в моем подзапросе


SELECT e.BusinessEntityID,p.FirstName [First Name], p.LastName [Last Name], DATEDIFF(YEAR,e.BirthDate, GETDATE() )[Age],
(SELECT eph1.Rate FROM HumanResources.EmployeePayHistory eph1 HAVING eph1.Rate = MAX(eph.ModifiedDate))
FROM Person.Person p 
JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID
JOIN HumanResources.EmployeePayHistory eph ON e.BusinessEntityID = eph.BusinessEntityID
GROUP BY e.BusinessEntityID, p.FirstName,p.LastName, DATEDIFF(YEAR,e.BirthDate, GETDATE() )

1 Ответ

0 голосов
/ 10 апреля 2020

Это проблема с наибольшим числом групп. Не думайте о агрегации: вместо этого подумайте о фильтрации.

Полагаю, это делает то, что вы хотите:

SELECT 
    e.BusinessEntityID
    p.FirstName [First Name], 
    p.LastName [Last Name], 
    DATEDIFF(YEAR,e.BirthDate, GETDATE()) [Age],
    (
        SELECT TOP (1) eph.Rate 
        FROM HumanResources.EmployeePayHistory eph 
        WHERE eph.BusinessEntityID = p.BusinessEntityID
        ORDER BY eph.ModifiedDate DESC
    ) [LatestRate]
FROM Person.Person p 
JOIN HumanResources.Employee e ON p.BusinessEntityID = e.BusinessEntityID

Примечание: вы не сказали точно, какова связь между Person и Employee - вышеизложенное предполагает, что это 1-1 отношения.

...