【问题标题】:Column invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中
【发布时间】:2014-11-02 17:46:38
【问题描述】:

我们有一个表格可以记录每个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();

得到错误:

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

有什么帮助吗?

提前致谢。

【问题讨论】:

标签: sql sql-server group-by aggregate


【解决方案1】:

这不应该被标记为 mysql,因为这不会在 mysql 中发生。

sql-server 不知道要返回哪个分组的 [Employee First Name] 值,因此您需要添加一个聚合(即使您实际上只期望一个结果)。在这种情况下,最小值/最大值都可以工作。这同样适用于不在 GROUP BY 中或周围没有聚合函数 (EG min) 的所有其他行。

【讨论】:

  • mysql 顺便说一句更容易上手,如果不使用聚合函数,它会返回找到的第一个值。然而,这可能会导致它自己的问题。
【解决方案2】:

请尝试以下查询:

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();

【讨论】:

  • 在 where 条件下抛出异常
  • 现在检查实际上我使用了 where 条件,除了 where 条件在组中没有工作现在尝试我现在​​更新的新查询。
【解决方案3】:

错误说明了一切:

...Employee First Name' 在选择列表中无效,因为它不包含在内 在聚合函数或 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]

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

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])

【讨论】:

  • 收到错误“CURDATE”不是可识别的内置函数名称。
  • 这个是mysql还是sql server,那个是mysql函数
  • 我正在尝试在 sql server 2012 中执行
  • 如果是 sql server 使用GETDATE(),我已经更新了帖子
【解决方案4】:

首先找到每个员工在给定日期(CURDATE)的第一个时间戳,然后返回主表以获取所有详细信息:

WITH x AS (
    SELECT [employee number], MIN([datetime] AS minDate
      FROM [Interface].[dbo].[VwEmpSwipeDetail]
      WHERE CAST([datetime] AS DATE) = CURDATE()
      GROUP BY [employee number]
)
select [employee number]
      ,[Employee First Name]
      ,[Employee Last Name]
      ,[DateTime]
      ,[Card Number]
      ,[Reader Name]
      ,[Status]
      ,[Location]
  from [Interface].[dbo].[VwEmpSwipeDetail] y
  JOIN x ON (x.[employee number] = y.[employee number] AND x.[minDate] =Y.[datetime]

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2013-08-17
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多