【问题标题】:Invalid COLUMN in the select list because it is not contained in either an aggregate function or the GROUP BY clause选择列表中的 COLUMN 无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中
【发布时间】: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 获取相同的结果。请赐教。

【问题讨论】:

标签: mysql sql sql-server


【解决方案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;
                

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

                【讨论】:

                  猜你喜欢
                  • 2014-04-16
                  • 2014-05-14
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-09
                  • 1970-01-01
                  相关资源
                  最近更新 更多