SQL Group By function(column) - 现在无法选择该列

标签 sql oracle aggregate-functions ora-00979

我在 Oracle Express 中使用了 HR 员工模式,我想选择特定年份雇用的员工。

  SELECT hire_date, 
         COUNT(*)
    FROM employees empl
GROUP BY SUBSTR(hire_date, -4)
ORDER BY empl.hire_date;

hiring_date 列的格式为“1/1/2011”,所以我想将它们分组
通过提取最后四个字符。

问题是,我遇到以下错误
ORA-00979: not a GROUP BY expression
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Error at Line: 1 Column: 7

这不可能吗?

最佳答案

您不能选择完整的 hire_date如果你只按它的最后四位数字分组。想想如果你有两行会发生什么:

hire_date
=========
01/01/2001
02/02/2001

在将它们分组时生成的单行中,hire_date 应该是什么?是?

所选的每一列都必须是分组列或聚合列。换句话说,尝试:
select substr(hire_date,-4), count(*)
from employees
group by substr(hire_date,-4)
order by empl.hire_date;

我应该提到每行函数在缩放方面是出了名的糟糕。如果要大量处理年份,则应考虑将其拆分为单独的列。这可能会大大提高性能,但要衡量,不要猜测!

而且,正如其他人在评论中提到的,substr可能不是最好的解决方案,因为这可能取决于语言环境(例如:日期可能被格式化为 YYYY-MM-DD,这与 substring 不符)。

使用类似 to_char(hire_date,'YYYY') 的东西可能会更好或 extract (year from hire_date)这应该更健壮。

关于SQL Group By function(column) - 现在无法选择该列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6135213/

相关文章:

mysql - 将字符字段与位掩码进行比较

sql - 如何在表格中找到一系列没有间隙的序列号

.net - SSRS使用日历来选择日期参数

java - Oracle ORDS OAuth2,500 错误,来自 oracle.dbtools.common.util.Base64.base64ToByteArray 的 “String length must be a multiple of four”

Oracle:通过 SELECT 语句创建临时表

sql - 如何聚合描述列?

java - JPA注释和SQL表

r - Dplyr - 错误 : column '' has unsupported type

sql - 使用 json_agg 从 SQL 查询获取 [null] 响应

java - 将不同模式中的对象表映射到java数据类型