找到员工的姓名,他们的名字相同但工资不同

时间:2012-12-11 03:20:26

标签: sql

我有一张带有

的'员工'表
create table employee
(
  e_number int,
  e_name varchar(20),
  salary money,
  hire_date date
)

现在我只想显示姓名相同但薪水不同的员工姓名。

我试过select e_name,count(*) from employee group by e_name having count(*)>1; 但不能将它与“同一薪水”部分结合起来。有什么帮助吗?

6 个答案:

答案 0 :(得分:4)

这假定您需要列出两个人的姓名:

SELECT e1.e_name
FROM employee e1, employee e2
WHERE e1.e_name = e2.e_name
AND e1.salary <> e2.salary;

如果您只希望列出一次名称,则可以使用SELECT DISTINCT而不是SELECT。

答案 1 :(得分:2)

如果您的目标是在having子句中表达:

Select name 
 from employee
 group by name
 having 
   count(*) > 1
   and min(salary) != max(salary)
 order by name

答案 2 :(得分:0)

SELECT employee1.e_name, employee1.Salary, Employee2.Salary
FROM Employee employee1
JOIN Employee employee2
  on employee1.name = employee2.name
 AND Employee1.Salary <> Employee2.Salary
 AND Employee1.E_Number <> employee2.E_Number

基本上让每一位员工通过姓名将员工加入其他员工,员工人数不同(所以不要加入自己),薪水也不同。

您可能不需要检查员工编号是否不同,因为1名员工在表格设计中只能有1个工资

答案 3 :(得分:0)

使用连接,但重要的是使用大于比较,而不是非等于,以避免重复:

SELECT e1.e_name as name1, e2.e_name as name2
FROM employee e1
JOIN employee e2 ON e1.e_name = e2.e_name
    AND e1.salary > e2.salary;

另请注意,ON条件包含工资比较。一种常见的误解是条件的连接可能只包含与密钥相关的比较。这样做可以带来显着的性能优势,尤其是在进一步连接时,因为ON条件在行连接时执行 - 这会立即丢弃不匹配,而WHERE条件作为连接的整个结果集执行过滤

答案 4 :(得分:0)

您只需要计算不同的工资,而不是所有记录的数量。

select e_name,count(distinct salary)
from employee
group by e_name
having count(distinct salary)>1

(如果不需要,请将选择中的计数删除 - 包括在您的示例中)

答案 5 :(得分:0)

首先过滤薪水不是双倍(不在),然后按e_name进行分组计数&gt; 1

SELECT A.e_name
FROM employee A 
WHERE A.salary NOT IN (SELECT salary FROM employee  WHERE id != A.id)
GROUP BY A.e_name
HAVING COUNT(A.e_name) > 1