选择列表中的列无效,因为该列未包含在聚合函数或GROUP BY子句中

use*_*020 6 sql sql-server group-by aggregate

我们有一个表格,可以记录每个表格的刷卡记录employee。我正在尝试编写一个查询,以通过今天的第一次滑动来获取不同员工记录的列表。

我们将滑动日期信息保存在datetime列中。这是我的查询的抛出异常。

 select distinct 
    [employee number], [Employee First Name]
    ,[Employee Last Name]
    ,min([DateTime])
    ,[Card Number]
    ,[Reader Name]
    ,[Status]
    ,[Location] 
from 
    [Interface].[dbo].[VwEmpSwipeDetail] 
group by  
    [employee number] 
where 
    [datetime] = CURDATE();
Run Code Online (Sandbox Code Playgroud)

出现错误:

在选择列表中,“ Interface.dbo.VwEmpSwipeDetail.Employee名”列无效,因为它不包含在聚合函数或GROUP BY子句中。

有什么帮助吗?

提前致谢。

Tan*_*ner 7

错误说明了一切:

...“雇员名字”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

这样说,还有其他列也需要注意。

将返回的列减少为仅需要的列,或者将这些列包含在GROUP BY子句中,或者添加聚合函数(MIN / MAX)。另外,您的WHERE子句应放在之前GROUP BY

尝试:

select   distinct [employee number]
      ,[Employee First Name]
      ,[Employee Last Name]
      ,min([DateTime])
      ,[Card Number]
      ,min([Reader Name])
from [Interface].[dbo].[VwEmpSwipeDetail] 
where CAST([datetime] AS DATE)=CAST(GETDATE() AS DATE)
group by  [employee number], [Employee First Name], [Employee Last Name], [Card Number]
Run Code Online (Sandbox Code Playgroud)

我已经删除了statuslocation因为这很可能会返回不同的值。为了返回此数据,您可能需要一个首先获取SwipeDetails表的唯一ID的子查询(或CTE),然后您可以从该列表中加入其他数据,例如:

SELECT [employee number],[Employee First Name],[Employee Last Name].. -- other columns
FROM [YOUR_TABLE]
WHERE SwipeDetailID IN (SELECT MIN(SwipeDetailsId) as SwipeId
                        FROM SwipeDetailTable
                        WHERE CAST([datetime] AS DATE)=CAST(GETDATE() AS DATE)
                        GROUP BY [employee number])
Run Code Online (Sandbox Code Playgroud)


Nav*_*eet 5

请尝试以下查询:

select   distinct [employee number],[Employee First Name]
          ,[Employee Last Name]
          ,min([DateTime])
          ,[Card Number]
          ,[Reader Name]
          ,[Status]
          ,[Location] from [Interface].[dbo].[VwEmpSwipeDetail] group by [employee number],[Employee First Name]
          ,[Employee Last Name]
          ,[Card Number]
          ,[Reader Name]
          ,[Status]
          ,[Location] having [datetime]=GetDate();
Run Code Online (Sandbox Code Playgroud)