我在寻找 SQL 查询的解决方案时遇到问题。这可能是一个非常明显的初学者问题,但我似乎无法得到我想要的结果。我有一张如下所示的表格:
|Name |Station|Salary|
|Bob |1 |2000 |
|Steve|2 |1750 |
|Mark |3 |2050 |
|Lisa |4 |2200 |
|Hans |5 |2000 |
我想选择此表中具有相同薪水的人员姓名。结果当然应该是Bob和Hans。
如果您在“薪资”上加入表格,但姓名是分开的,那么这应该会为您提供任何匹配的受薪人员:
SELECT s1.Name, s1.Station, s1.Salary
FROM Staff s1
INNER JOIN Staff s2 ON s1.Salary = s2.Salary AND s1.Name <> s2.Name
这是一个 SQLFiddle 来展示它的实际效果
SELECT Name
FROM table1
WHERE Salary IN (
SELECT Salary
FROM table1
GROUP BY Salary
HAVING COUNT(*) > 1
)
如果您确定有多名员工的薪资范围,您可以将其作为派生表连接回:
SELECT e.Name, e.Station
FROM Employee e
INNER JOIN
(
SELECT Salary
FROM Employee
GROUP BY Salary
HAVING COUNT(*) > 1
) grp ON e.Salary = grp.Salary;
大多数数据库都支持窗口函数。执行此操作的简单方法是计算拥有给定工资的人数。然后选择那些人。这是一个简单的方法:
select t.*
from (select t.*, count(*) over (partition by salary) as salarycnt
from table t
) t
where salarycnt > 1
order by salary;
试试这个:
SELECT E1.Name, E1.Salary
FROM Employee E1, Employee E2
WHERE E1.Salary = E2.Salary
AND E1.Name <> E2.Name
使用以下查询:
with datatab as
(
select 'Bob' Name, 1 Station, 2000 Salary from dual union
select 'Steve' Name, 2 Station, 1750 Salary from dual union
select 'Mark' Name, 3 Station, 2050 Salary from dual union
select 'Lisa' Name, 4 Station, 2200 Salary from dual union
select 'Hans' Name, 5 Station, 2000 Salary from dual union
select 'Test' Name, 6 Station, 1750 Salary from dual
)
SELECT NAME, sTATION, SALARY FROM DATATAB
WHERE SALARY IN
(
SELECT Salary
FROM datatab
GROUP BY Salary
HAVING COUNT(1) > 1
);
正如有人在编辑中建议的那样,查询将是:
SELECT NAME, sTATION, SALARY FROM TABLE_NAME
WHERE SALARY IN
(
SELECT Salary
FROM TABLE_NAME
GROUP BY Salary
HAVING COUNT(1) > 1
)
选择a.姓名、a.薪水 ( 选择 count(salary) 作为 cnt,从员工组中选择 count(salary) > 1 的薪水
) 作为 X 内加入人员a上a.Salary=x.salary
按工资订购:
当您必须将同一个表放置两次或多次时,请使用别名:
select t1.Name,
t2.Name,
t1.Salary
from MyTable t1,
MyTable t2
where t1.Station > t2.Station and -- if Station is id
-- t1.Name > t2.Name -- if Name is in fact an id
t1.Salary = t2.Salary
试试这个:
select COUNT(*) as NumberOfPerson,salary from tblEmployee group by salary having COUNT(*)>1
对于 MySQL:
从工人中选择* 工资在哪里(从工人中选择工资 按工资分组 有计数(1)> 1);
假设表名称是:employee
从员工 e、员工 e1 中选择不同的 e.name、e.salary,其中 e.salary = e1.salary 和 e.name != e1.name;
第一个解决方案:
从员工 e1 中选择 e1.name 在 e1.salary=e2.salary 上内部加入员工 e2 AND e1.name <> e2.name
第二个简单的解决方案:
选择员工姓名 其中工资在(从员工中选择工资 按工资分组 有 count(*)>1)
将同一张表视为单独的两个表。
SELECT DISTINCT T.username, T.salary
FROM account T, account T
WHERE T.salary = T.salary
AND T.username <> T.username
ORDER BY salary;
假设我们有名为 EMP3 的表,其中的列为 FIRST_NAME、LAST_NAME、SALRY、DEPARTMENT_ID、COMMISSION 等。
现在我们必须选择具有相同薪水的员工记录。
让我们借助自加入来获得输出。
在这里,我们将同一个表与其本身连接起来,以获取具有相同薪水的记录。
SELECT E1.FIRST_NAME AS FN,E1.SALARY FROM EMPLOYEES E1 INNER JOIN EMPLOYEES E2 ON E1.SALARY=E2.SALARY;
你想要同样工资的人数吗?
SELECT count(*) FROM table GROUP BY salary