我有一个表:[tblEmp]
EmpId | EmpName | DeptId
和表[tblSalary]
EmpId | Salary
而且我需要找到他们部门里工资最高的员工名单。
我可以通过以下方式实现这一点:
SELECT *
FROM tblEmp
JOIN tblSal ON tblSal.EmpId = tblEmp.EmpId
WHERE LTRIM(STR(deptid)) + LTRIM(STR(salary)) IN (
SELECT LTRIM(STR(deptid)) + LTRIM(STR(MAX(salary)))
FROM tblSal
JOIN tblEmp ON tblSal.EmpId = tblEmp.EmpId
GROUP BY DeptId
)
有没有更好的方法实现榜单?
这通常是您使用分析函数的地方:
SELECT *
FROM ( SELECT tblSal.*, tblEmp.*,
RANK() OVER (PARTITION BY tblEmp.deptid ORDER BY tblSal.salary DESC) as SalaryRank
FROM tblEmp
JOIN tblSal ON tblSal.EmpId = tblEmp.EmpId
)
WHERE SalaryRank = 1
您可以尝试使用row_number。
返回结果集分区中一行的顺序编号,每个分区中的第一行从1开始。
类似于
;WITH Employees AS (
SELECT e.*,
ROW_NUMBER() OVER(PARTITION BY e.DeptId ORDER BY s.salary DESC) RowID
FROM [tblEmp] e INNER JOIN
[tblSalary] s ON e.EmpId = s.EmpId
)
SELECT *
FROM Employees
WHERE RowID = 1
但是,这将不会返回在同一部门拥有相同薪资的员工。
为此,您可能需要查看RANK(Transact-SQL)或DENSE_RANK(Transact-SQL)而不是row_number。
Rank:返回结果集分区中每一行的秩。行的秩是一加所讨论的行之前的秩数。
如果两个或两个以上的行为一个等级打成平局,则每条打成平局的行将得到相同的等级。
Dense_Rank:返回结果集分区中行的排名,排名中没有任何间隙。行的秩是一加所讨论的行之前的不同秩的数目。
有两张桌子: 问题是如何找到哪个经理支付给他的员工的平均工资(+奖金)最高?
问题内容: 不太确定如何获得这个。我有一个职员表,我需要找到平均工资。我知道我可以使用use 。但是,诀窍是我需要找到拥有5名以上职员的部门的平均值。我不确定是否应使用分组依据或使用方式。谢谢! 问题答案:
问题内容: 我有一个100名员工的员工表。我想编写一个查询来查找具有相同BIRTHDATE的成对雇员。 结果应返回该对中每个雇员的EMPNO,LASTNAME和BIRTHDATE(6列结果表)。 我以为是这样 你认为这是正确的吗? 问题答案: 我会做:
嗨,我有两个班,员工和部门。我的主要功能是读取一个。txt文件,填写员工姓名、工资、部门和职位。我的员工班只是一个有成就感和有成就感的人。为了代表员工,我制作了一份ArrayList列表,我不确定如何找到每个部门的最低工资。为了找到最高工资,我在我的系课上这样做了。 但我不知道怎样才能拿到最低工资。我的想法是从每个部门获得一名员工的工资,并以此作为工作的起点 但是我意识到我不知道该怎么办。我能得到
Sql查询来查找活动员工。根据employee id列降序对输出进行排序,只获取前15条记录。显示员工id、员工姓名、城市、州、国家、薪资、在职日期、状态、部门名称、经理姓名。雇员姓名:用空格字符连接firstname和lastname并只从雇员姓名中提取前10个字母经理姓名:显示firstname和lastname(用空格分隔) null
问题内容: 假设您得到以下名为Employee的简单数据库表,该表具有2个列,分别名为Employee ID和Salary: 我想写一个查询,从员工那里选择max(salary)作为max_salary,2nd_max_salary 然后它应该返回 我知道如何找到第二高的薪水 或找到第n个 但我无法弄清楚如何将这2个结果结合起来以获得所需的结果 问题答案: 您可以只运行2个查询作为内部查询以返回2