当我想在我的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;
答案 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_amount
或lgsalary_history
中lgemployee
是SELECT 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}}
这将返回具有最高薪水的给定部门中的所有员工(因此,如果有多个,则会返回两个或三个等)。