e_id | name | d_id | salary | commission |
---|---|---|---|---|
10 | John | 10 | 3000 | 200 |
20 | Jeremiah | 20 | 3000 | 400 |
30 | Jane | 10 | 3000 | 0 |
40 | James | 10 | 4000 | 500 |
I wanted to display employees that have the same d_id and salary with employees that have commission.
I tried:
SELECT name, d_id, salary
FROM employees
WHERE (d_id, salary) IN (
SELECT d_id, salary
FROM employees
WHERE commission > 0);
Expected output:
name | d_id | salary |
---|---|---|
John | 10 | 3000 |
Jane | 10 | 3000 |
Actual output:
name | d_id | salary |
---|---|---|
John | 10 | 3000 |
Jeremiah | 20 | 3000 |
Jane | 10 | 3000 |
James | 10 | 4000 |
CodePudding user response:
Modify your query as the following:
SELECT name, d_id, salary
FROM employees
WHERE (d_id, salary) IN (
SELECT d_id, salary
FROM employees
Group By d_id, salary
Having Max(commission) > 0 And Count(*) > 1);
Having Max(commission) > 0
ensures that at least one employee have a commision value > 0.
Count(*) > 1
ensures that there is more than one employee with the same d_id, salary.
See a demo.
CodePudding user response:
If your DBMS allows for window functions, you can use the COUNT
one with partition on pairs of "<d_id, salary>". This will allow you to count how many existing identical couples are there for each couple. All count values bigger than 1 are the ones you're looking for.
WITH cte AS (
SELECT *, COUNT(name) OVER(PARTITION BY d_id, salary) AS cnt
FROM tab
)
SELECT name, d_id, salary
FROM cte
WHERE cnt > 1
Here's a demo for MySQL 8.0, but most likely will work on most DBMS' supporting window functions.