SQL Group By函数(列) - 现在无法选择该列

时间:2011-05-26 07:37:56

标签: 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;

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

这不可能吗?

4 个答案:

答案 0 :(得分:9)

如果您分组仅按其最后四位数,则无法选择完整的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)等更强大的内容。

答案 1 :(得分:7)

您还可以截断hiredate列

select trunc(hiredate, 'yyyy'), count(*) 
from employee
group by trunc(hiredate, 'yyyy')

答案 2 :(得分:1)

如果您希望在雇用的那一年中雇用组员工

select to_char(hiredate,'yyyy'),count(*) 
from employee
group by to_char(hiredate,'yyyy')

答案 3 :(得分:0)

您只能在GROUP BY查询的MIN, MAX, AVG部分中使用SELECT条件或汇总函数(GROUP BY等)。这有效:

select substr(hire_date,-4), count(*)
from employees empl
group by substr(hire_date,-4)
order by substr(hire_date,-4);