选择列表中的 COLUMN 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中

Posted

技术标签:

【中文标题】选择列表中的 COLUMN 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中【英文标题】:Invalid COLUMN in the select list because it is not contained in either an aggregate function or the GROUP BY clause 【发布时间】:2019-11-01 22:12:51 【问题描述】:

我在 mysql 和 MSSQL(SQL server) DB 中有一个名为 - tbl_emp_info 的表,具有相同的架构和数据。

我正在对此数据执行以下查询 -

MYSQL 查询

 select count(*), name from tbl_emp_info group by dept;

MSSQL 查询

 select count(*), name from tbl_emp_info group by dept;

当我执行 MYSQL 查询时,它会运行并给我结果。 但是当我执行 MSSQL 查询时,它给出了这个错误

SQL 错误 (8120):列 'NAME' 在 选择列表,因为它不包含在任一聚合中 函数或 GROUP BY 子句。

现在,我了解了这个错误,我已经检查了它的参考 - 看看这个:REF

此外,在 MYSQL 中 - 它会在输出中为 NAME 提供第一个值,并在 DEPT 执行“分组依据”时忽略 NAME 的其余值。

我还需要使用 MSSQL 获取相同的结果。请赐教。

【问题讨论】:

您按部门分组,但选择名称作为非聚合列。有问题。 MSSQL默认有严格的规定,如果列不在选择区域,它不会让你分组 添加一些样本数据和预期的输出结果。这会有所帮助。 SQL Server - Column "invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause"的可能重复 使用聚合函数时,不能使用聚合函数中不包含的列。这是针对 MSSQL 的。 【参考方案1】:

name 也应按以下方式分组: select count(*), name from tbl_emp_info group by dept, name;

您尝试显示的所有未汇总的列都必须分组。

【讨论】:

【参考方案2】:

当涉及到group by 时,MySQL 有configurable behaviour,因此默认情况下它会接受不符合 SQL-92 标准的查询; MS SQL 没有。

您的查询没有意义 - “按部门分组”意味着您想要获取每个部门的员工人数。 MySQL 只是为您提供每个部门的任意名称以及计数。我想这实际上不是你想要的。

如果你想按部门分组,你的查询应该是:

select count(*), dept from tbl_emp_info group by dept;

如果你想要部门和(按字母顺序)第一个员工,它应该是:

select count(*), min(name), dept from tbl_emp_info group by dept;

【讨论】:

【参考方案3】:

在sql中执行聚合时需要选择列 你应该如下

select count(*), name,dept from tbl_emp_info group by dept,name;

【讨论】:

【参考方案4】:

试试这个: 按名称从 tbl_emp_info 组中选择名称 count(1); 要么 select dept, count(1) from tbl_emp_info group by dept;

【讨论】:

【参考方案5】:

“分组依据”子句根据使用的字段整理统计信息。在 MSSQL 中,必须在分组字段中的每个值旁边查看统计信息。这里“select dept, count(*) from tbl_emp_info group by dept;”是正确的查询

【讨论】:

【参考方案6】:

我不确定您想要从查询中得到什么,但我猜您想要每个部门的姓名列表以及部门中这些姓名的数量。 如果是这样,那么试试这个:使用COUNT OVER Window 函数

select  NumOfNames = count(name)OVER(partition by dept)
       ,name 
from tbl_emp_info 
;

【讨论】:

【参考方案7】:

@Ankush Rathi 您只能在选择 MSSQL 时获取您在 group by 中使用的列。

【讨论】:

【参考方案8】:
select count(*), name from tbl_emp_info group by name;

按列分组只能与聚合函数一起使用。如果您想基于不同的列进行聚合,那么您可以使用内联选择而不是分区

【讨论】:

以上是关于选择列表中的 COLUMN 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中的主要内容,如果未能解决你的问题,请参考以下文章

选择列表中的列无效

SQL:选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 子句中[关闭]

如何解决这个无效的选择列表?

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

即使字段包含在分组依据列表中,分组依据或聚合错误

SQL Server 错误中的 GROUP_CONCAT