我在Oracle Express中使用了HR员工架构,我想选择在特定年份雇用的员工.
SELECT hire_date,COUNT(*) FROM employees empl GROUP BY SUBSTR(hire_date,-4) ORDER BY empl.hire_date;
hire_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,这对于子串也不会很好).
使用像to_char(hire_date,’YYYY’)或extract(从hire_date开始的年份)这样的东西可能会更好一些.