• I realize that, as this uses a cursor, it's the ultimate evil; however:

    SELECT Timecard.EmpID,

    SUM(Timecard.WrkHrs) AS WrkHrs,

    WrkEmp.FName AS EmpFName,

    WrkEmp.LName AS EmpLName,

    MgrEmp.EmpID AS MgrID,

    MgrEmp.FName AS MgrFName,

    MgrEmp.LName AS MgrLName

    INTO #EmpHoursByProject

    FROM Timecard

    INNER JOIN Project ON Timecard.ProjNum = Project.ProjNum

    INNER JOIN Employees MgrEmp ON Project.mbillaty = MgrEmp.EmpID

    INNER JOIN Employees WrkEmp ON Timecard.ttk = WrkEmp.EmpID

    WHERE (Timecard.HrsDate >= CONVERT(DATETIME, '10/1/2001', 102))

    AND (Timecard.HrsDate < CONVERT(DATETIME, '7/1/2002', 102))

    GROUP BY Timecard.EmpID,

    WrkEmp.FName,

    WrkEmp.LName,

    MgrEmp.EmpID,

    MgrEmp.FName,

    MgrEmp.LName

    HAVING (Timecard.EmpID <> MgrEmp.EmpID)

    --lazy man's table creation script

    SELECT *

    INTO #TopFiveEmpProj

    FROM #EmpHoursByProject

    WHERE EmpID <> EmpID

    DECLARE @curEmpId int -- assumes EmpID is an int

    DECLARE empCursor LOCAL CURSOR FOR

    SELECT DISTINCT EmpID FROM #EmpHoursByProject

    OPEN empCursor

    FETCH empCursor INTO @curEmpID

    WHILE (@@FETCH_STATUS = 0)

    BEGIN

    INSERT INTO #TopFiveEmpProj

    SELECT TOP 5 *

    FROM #EmpHoursByProject

    WHERE EmpID = @curEmpId

    ORDER BY WrkHrs DESC

    FETCH empCursor INTO @curEmpID

    END

    CLOSE empCursor

    DEALLOCATE empCursor

    DROP TABLE #EmpHoursByProject

    SELECT *

    FROM #TopFiveEmpProj

    ORDER BY EmpID,WrkHrs DESC

    I believe this will get you what you need. Now, everyone else can come in and tell you hwo to get it ten times faster, with 1/10 the memory. 🙂

    RD Francis


    R David Francis