0

我有以下代码。我的问题是我想从另一个表名 Employee 中检索每个员工姓名,该表名 Employee 的 EmployeeID 列类似于我在当前查询中使用的 AccessLog 表。现在,当我加入这两个表时,它给出了我在标题上所说的那个奇怪的错误。没有在第一个 SELECT 和 作为 A.EmployeeID= Employee.EmployeeID 到最后一个 ORDER By 子句的 INNER JOIN Employee,它运行良好。我认为问题在于命名/别名。我看到了类似的线程,但那些并没有解决我的问题。如果有人能指出我的错误,将不胜感激。

SELECT **A.EmployeeID,
    Employee.FirstName,**
    MonthName(Month([LogDate])) AS MonthName,
    Round((Sum(Int(DateDiff("s",'00:00:00',Duration)))/3600)) AS TotalTime
    FROM (
         SELECT AccessLog.EmployeeID, 
                AccessLog.LogDate, 
                AccessLog.TerminalID, 
                AccessLog.LogTime, 
                Format((SELECT max(LogTime) 
                        FROM AccessLog AS Alias 
                        WHERE Alias.LogTime < AccessLog.LogTime 
                        AND Alias.EmployeeID = AccessLog.EmployeeID 
                        AND Alias.LogDate = AccessLog.LogDate 
                        AND (Alias.TerminalID)<>"iGuard1A" 
                        And (Alias.TerminalID)<>"iGuard1B"  
                        AND Alias.EmployeeID = AccessLog.EmployeeID),"hh:nn:ss") AS PrevTime, 
                Format((ElapsedTime(iif(PrevTime = '',logtime,prevtime),[LogTime])),"hh:nn:ss") AS Duration, 
                AccessLog.InOut 
             FROM AccessLog 
             WHERE (((AccessLog.TerminalID)<>"iGuard1A" 
             And (AccessLog.TerminalID)<>"iGuard1B") 
             AND ((AccessLog.EmployeeID) Like "2*") 
             AND ((AccessLog.InOut)="OUT")) 
             ORDER BY AccessLog.EmployeeID, AccessLog.LogDate, AccessLog.LogTime)  
             **AS A INNER JOIN Employee ON A.EmployeeID= Employee.EmployeeID**
      GROUP BY EmployeeID, MonthName(Month([LogDate]));
4

2 回答 2

1

我认为这可能是GROUP BY EmployeeId- 尝试将其更改为GROUP BY A.EmployeeIdor 或GROUP BY Employee.EmployeeId

编辑:它可能必须是GROUP BY A.EmployeeId,因为那是使用 SELECT 的那个。

于 2012-08-12T10:52:58.030 回答
0

我解决了。正如我所说,存在名称/别名问题。我必须为每个子查询中使用的同一个表提供单独的别名。即使在那之后它显示了顶部选择中名字的另一个聚合函数错误,我也通过将它包含在子查询中来解决了这个问题。所以我的代码如下:

SELECT C.EmployeeID, 
   (SELECT Employee.FirstName& ' ' &Employee.LastName 
      FROM Employee 
      where C.EmployeeID= Employee.EmployeeID) 
    AS FullName, 
   MonthName(Month([LogDate])) AS MonthName,
   Round((Sum(Int(DateDiff("s",'00:00:00',Duration)))/3600)) AS TotalTime
   FROM (SELECT B.EmployeeID, 
              B.LogDate, 
              B.TerminalID, 
              B.LogTime, 
              Format((SELECT max(LogTime) 
                      FROM AccessLog AS A 
                      WHERE A.LogTime < B.LogTime 
                      AND A.EmployeeID = B.EmployeeID  
                      AND A.LogDate = B.LogDate 
                      AND (A.TerminalID)<>"iGuard1A" 
                      And (A.TerminalID)<>"iGuard1B"  
                      AND A.EmployeeID = B.EmployeeID),"hh:nn:ss") AS PrevTime,  
              Format((ElapsedTime(iif(PrevTime = '',logtime,prevtime),[LogTime])),"hh:nn:ss") AS Duration, 
              B.InOut 
              FROM AccessLog As B  
              WHERE (((B.TerminalID)<>"iGuard1A" 
               And (B.TerminalID)<>"iGuard1B") 
               AND ((B.EmployeeID) Like "2*") 
               AND ((B.InOut)="OUT")) 
               ORDER BY B.EmployeeID, B.LogDate, B.LogTime)  
AS C INNER JOIN Employee ON C.EmployeeID= Employee.EmployeeID
GROUP BY C.EmployeeID, MonthName(Month([LogDate]));
于 2012-08-13T00:35:34.067 回答