3

「従業員」テーブルがあります

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; ましたが、「同じ給料」セクションと組み合わせることはできません。何か助けはありますか?

4

6 に答える 6

4

これは、リストされている両方の人物の名前が必要であると仮定しています。

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

それぞれの名前を一度だけリストしたい場合は、SELECT の代わりに SELECT DISTINCT を使用します。

于 2012-12-11T03:26:36.100 に答える
2

あなたの目標がこれを having 句で表現することである場合:

Select name 
 from employee
 group by name
 having 
   count(*) > 1
   and min(salary) != max(salary)
 order by name
于 2012-12-11T03:33:47.577 に答える
0

すべてのレコードの数ではなく、個別の給与の数だけが必要です。

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

(不要な場合は選択にカウントをドロップします-例に含まれているため含まれています)

于 2012-12-11T03:44:05.370 に答える
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 つの給与しか持てないため、おそらく従業員番号が異なることを確認する必要はありません。

于 2012-12-11T03:30:23.770 に答える
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 条件は、結合の結果セット全体に対するフィルターとして実行されます。 .

于 2012-12-11T03:38:06.803 に答える
0

最初に給与が 2 倍でない (含まれていない) をフィルター処理し、次にe_namecount > 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
于 2012-12-11T03:53:17.027 に答える