ORA-00979:不是GROUP BY表达式在尝试使用MAX函数时

时间:2015-02-16 02:40:57

标签: sql oracle11g

当我想在我的select语句中添加em_fname和emp_lname时。我一直得到Not A GROUP BY EXPRESSION错误。

当我将这些2添加到GROUP BY子句中时,我得到了不需要的查询结果(非常冗余)。

对此有何建议?

select lgemployee.dept_num, emp_fname,emp_lname, max(sal_amount) as
HighestSalary 
from lgsalary_history inner join lgemployee on lgsalary_history.EMP_NUM = lgemployee.EMP_NUM  
group by lgemployee.dept_num;

2 个答案:

答案 0 :(得分:0)

将无聚合列添加到按条件分组,也可能需要left外部或right外部联接(取决于您的数据)

select lgemployee.dept_num, emp_fname,emp_lname, max(sal_amount) as
HighestSalary 
from lgsalary_history inner join lgemployee on lgsalary_history.EMP_NUM = lgemployee.EMP_NUM  
group by lgemployee.dept_num,emp_fname,emp_lname;

答案 1 :(得分:0)

  

但是我希望显示每个部门员工的最高sal_amount。如果我删除emp_fname和emp_lname,我有8行(来自8个部门),但如果我按照你的建议添加它们,我得到363个结果(不是我想要的)!

很难说出你的架构是什么样的。 sal_amountlgsalary_historylgemployeeSELECT dept_num, emp_fname, emp_lname FROM ( SELECT lge.dept_num, lge.emp_fname, lge.emp_lname , lgs.sal_amount , RANK() OVER ( PARTITION BY lge.dept_num ORDER BY lgs.sal_amount DESC) rn FROM lgemployee lge INNER JOIN lgsalary_history lgs ON lge.emp_num = lgs.emp_num ) WHERE rn = 1; (我猜测后者,但由于您不使用表别名,因此不清楚)。

考虑到这一点,您可能需要以下内容:

lgsalary_history

现在这里有一个额外的困难,即如果dt是我认为的那样,它将存储除当前工资之外的过去工资。而且,即使不太可能,也可以削减特定员工的薪水。以上查询并未考虑到这一点。因此,让我们假设您的工资历史记录已过时,lgsalary_history中有一列SELECT dept_num, emp_fname, emp_lname, sal_amount FROM ( SELECT dept_num, emp_fname, emp_lname, sal_amount , RANK() OVER ( PARTITION BY dept_num ORDER BY sal_amount DESC ) AS rn FROM ( SELECT e.dept_num, e.emp_fname, e.emp_lname, s.sal_amount, ROW_NUMBER() OVER ( PARTITION BY e.emp_num ORDER BY s.dt DESC ) AS rn FROM lgemployee e INNER JOIN lgsalary_history s ON e.emp_num = s.emp_num ) WHERE rn = 1 ) WHERE rn = 1; ,可以确定给定员工的最新工资。

{{1}}

这将返回具有最高薪水的给定部门中的所有员工(因此,如果有多个,则会返回两个或三个等)。