选择列表中的 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 子句中[关闭]