每个 group by 表达式必须至少包含一个不是外部引用的列。_神奇的 SQL 之层级:为什么 GROUP BY 之后不能直接引用原表中的列...
时间: 2024-04-01 07:33:01 浏览: 15
在 SQL 中,GROUP BY 用于将行分组并计算聚合函数,例如 SUM、COUNT、AVG 等。在 GROUP BY 之后,只能引用聚合函数、GROUP BY 中的列和常量,而不能直接引用原表中的列。这是因为 GROUP BY 操作会将原表中的行按照 GROUP BY 中的列进行分组,每个分组的结果只包含 GROUP BY 中的列和聚合函数的计算结果。因此,在 GROUP BY 之后引用原表中的列是没有意义的,因为这些列已经被分组合并成了一个值。如果需要在聚合函数中使用原表中的列,可以使用子查询或者临时表来实现。
相关问题
每个 GROUP BY 表达式必须至少包含一个不是外部引用的列
是的,每个 GROUP BY 表达式必须至少包含一个在该表中定义的列,或者是一个聚合函数,而不是外部引用的列。如果 GROUP BY 表达式不符合这个要求,那么查询就会失败并返回错误。这是因为 GROUP BY 子句用于将结果集中的行分组,并对每个分组执行聚合操作,而如果分组表达式不是有效的表达式,那么就无法对其进行分组和聚合操作。
还是会报消息 164,级别 15,状态 1,第 8 行 每个 GROUP BY 表达式必须至少包含一个不是外部引用的列。
如果你按照我刚才提供的方法仍然遇到了相同的错误,那么你可以尝试将 WHERE 子句中的子查询转换为一个 JOIN,然后在 GROUP BY 子句中包含表别名前缀,像这样:
```
SELECT e.EmployeeID, e.Name, e.Education, e.Birthday, e.Sex, e.Workyear, e.Address, e.PhoneNumber
FROM Employees202207210212 e
JOIN (
SELECT EmployeeID, SUM(income) - SUM(expense) AS TotalIncome
FROM Salary2022070210212
GROUP BY EmployeeID
) AS EmployeeIncome ON e.EmployeeID = EmployeeIncome.EmployeeID
WHERE EmployeeIncome.TotalIncome <= 2500
GROUP BY e.EmployeeID, e.Name, e.Education, e.Birthday, e.Sex, e.Workyear, e.Address, e.PhoneNumber;
```
这个查询应该可以运行,并且不再出现“每个 GROUP BY 表达式必须至少包含一个不是外部引用的列”的错误消息。