SELECT first_name, last_name, salary, SUM(salary) OVER() FROM employee;运行报错
时间: 2024-10-14 16:10:39 浏览: 34
abc.rar_ABC_salary manager
在SQL查询中,`SUM(salary) OVER()` 是一个窗口函数,它用于计算每个组别的总和,但如果没有明确指定PARTITION BY,这将会尝试在整个数据集上应用,而`employee`表可能没有指定group by的列。当没有明确的分组依据时,MySQL会抛出 `1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'table.column'; this is incompatible with sql_mode=only_full_group_by` 这样的错误。
这个错误提示告诉你,你在查询结果中包含了未在GROUP BY子句中列出的非聚合列(这里是`first_name`, `last_name`, 和 `salary`),并且当前设置的sql_mode不允许这样的操作(默认的`ONLY_FULL_GROUP_BY`模式)。要解决这个问题,你可以:
1. **明确分组**:如果你想按某个列对整个表求和,加上`GROUP BY`子句,例如`GROUP BY first_name, last_name`。
2. **修改sql_mode**:临时关闭`ONLY_FULL_GROUP_BY`限制,但这不是一个好的长期实践,因为它会影响其他依赖于完整分组规则的查询。例如:`SET sql_mode = ''`(注意这不是在生产环境中推荐的做法)。
3. **移除窗口函数**:如果不需要基于整个数据集的汇总,直接去掉`OVER()`部分,仅保留`SUM(salary)`。
下面是几种情况的示例:
- 如果你想按员工姓名分组再计算工资总和:
```sql
SELECT
first_name,
last_name,
salary,
SUM(salary) OVER(PARTITION BY first_name, last_name)
FROM employee;
```
- 如果你只想看每行的工资总和(无分组):
```sql
SELECT
first_name,
last_name,
salary,
SUM(salary)
FROM employee
GROUP BY first_name, last_name, id; -- 或者加上其他唯一标识列
```
阅读全文