I find it good practice to use subqueries to reduce the total number of join operations and the number of columns in a GROUP BY block. So I’ll tell you right away that the first request is definitely more efficient.
Inquiries
SELECT t.OrderYear , t.CustomerID , t.CustomerOrderAmt , p.FirstName , p.LastName FROM ( SELECT OrderYear = YEAR(OrderDate) , CustomerID , CustomerOrderAmt = COUNT(CustomerID) FROM Sales.SalesOrderHeader GROUP BY YEAR(OrderDate) , CustomerID HAVING COUNT(CustomerID) > 1 ) t JOIN ( SELECT p.FirstName , p.LastName , c.CustomerID FROM Person.Person p JOIN Sales.Customer c ON c.PersonID = p.BusinessEntityID ) p ON t.CustomerID = p.CustomerID ORDER BY t.OrderYear , t.CustomerID
vs
SELECT Orderdate = YEAR(so.OrderDate) , so.CustomerID , CustomerOrderAmt = COUNT(so.CustomerID) , FirstName = MAX(p.FirstName) , LastName = MAX(p.LastName) FROM Sales.SalesOrderHeader so JOIN Sales.Customer c ON so.CustomerID = c.CustomerID JOIN Person.Person p ON c.PersonID = p.BusinessEntityID GROUP BY YEAR(so.OrderDate) , so.CustomerID HAVING COUNT(so.CustomerID) > 1
Request Cost:

Lead time:
-- first query SQL Server Execution Times: CPU time = 94 ms, elapsed time = 395 ms. -- second query SQL Server Execution Times: CPU time = 140 ms, elapsed time = 480 ms.
source share