not in group by

在新版MySQL中遇到GROUP BY函数无法正常使用的问题,原因是SQL_MODE设置为EL开头的模式。为启用GROUP BY,需要将SQL_MODE设置为STRICT_TRANS_TABLES。可以使用以下命令进行设置:`set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';` 和 `set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';` 这将确保GROUP BY功能正常运行。

在使用新的mysql中 group by 函数不能使用 查看他的是EL开头,要设置成 STRICT 如下

set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

set session sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

即可

 

### 解决方案 当遇到 `'expression not in group by key'` 错误时,通常是因为在 `GROUP BY` 查询中选择了某些未聚合的字段,而这些字段既不在 `GROUP BY` 子句中也没有被任何聚合函数处理。这种情况下,SQL 引擎无法确定如何为每组数据返回单一值。 #### 修正方法 为了修复此错误,可以采取以下两种方式之一: 1. **将所有非聚合列加入到 `GROUP BY` 子句中** 如果希望保留原始表中的每一列,则需要将其显式添加到 `GROUP BY` 列表中。例如,在给定的例子中,如果需要按 `IncidentType` 进行分组并计算其他统计量,则应确保所有非聚合列都包含在 `GROUP BY` 中[^1]。 2. **仅选择聚合列或将非聚合列替换为聚合表达式** 另一种解决方案是移除非必要的列或者通过应用合适的聚合函数来替代它们。比如,对于字符串连接操作,可考虑使用窗口函数或其他特定于数据库的功能实现[^2]。 以下是基于上述原则调整后的 SQL 示例代码片段: ```sql -- 修改版本一:增加额外字段至 GROUP BY SELECT it.IncidentType, AVG(ir.NumberOfIncidents) AS MeanNumberOfIncidents, STDEV(ir.NumberOfIncidents) AS NumberOfIncidentsStandardDeviation, VAR(ir.NumberOfIncidents) AS NumberOfIncidentsVariance, COUNT(*) AS NumberOfRows FROM dbo.IncidentRollup ir INNER JOIN dbo.IncidentType it ON ir.IncidentTypeID = it.IncidentTypeID INNER JOIN dbo.Calendar c ON ir.IncidentDate = c.Date WHERE c.CalendarQuarter = 2 AND c.CalendarYear = 2020 GROUP BY it.IncidentType; -- 或者修改版本二:减少不必要的非聚集字段 SELECT it.IncidentType, CAST(AVG(ir.NumberOfIncidents) AS DECIMAL(4,2)) AS MeanNumberOfIncidentsDecimal, STDEV(ir.NumberOfIncidents) AS StdDev, VAR(ir.NumberOfIncidents) AS Variance, COUNT(*) AS RowCount FROM dbo.IncidentRollup ir INNER JOIN dbo.IncidentType it ON ir.IncidentTypeID = it.IncidentTypeID INNER JOIN dbo.Calendar c ON ir.IncidentDate = c.Date WHERE c.CalendarQuarter = 2 AND c.CalendarYear = 2020 GROUP BY it.IncidentType; ``` 以上两个例子展示了不同的解决策略。第一个保持了更多的细节信息;第二个则简化了输出结构以便更专注于统计数据本身[^3]。 ### 注意事项 需要注意的是不同 DBMS 对标准的支持程度可能有所差异,因此具体语法可能会略有变化。务必查阅所使用的数据库系统的官方文档确认兼容性和最佳实践。 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值