I wrote a query joining two tables and I got a below resultset:
SELECT emp.employee_id,
dept.department_name,
dept.department_id
FROM employee emp,
department dept
WHERE emp.department_id = dept.department_id;
Employee_ID Department Department_ID
Mark Sales D1
Mark Marketing D2
Justin Textiles D3
Kimberley (null) (null)
However, I need to display below output with one new field called ‘Status’.Mark can work in both the departments and so the count is “2” and the status will be ‘Y’ ( displaying of any one record is okay) . Justin works in only one department and count is 1 and status should be ‘N’. Kimberley does not work anywhere and count is 0 and status should be ‘N’.
Expected output:
Employee_ID Department Department_ID Status
Mark Sales D1 Y
Justin Textiles D3 N
Kimberley (null) (null) N
Please help.
Advertisement
Answer
I understand that you want to display the first department per user, and add a flag that indicates whether the employee belongs to at least one other department.
You can use window functions:
select
employee_id,
department_name,
department_id
case when cnt <= 1 then 'N' else 'Y' end status
from (
select
emp.employee_id,
dept.department_name,
dept.department_id,
row_number() over(partition by emp.employee_id order by dept.department_id) rn,
count(*) over(partition by emp.employee_id) cnt
from
employee emp
left join department dept on emp.department_id = dept.department_id
) t
where rn = 1
Side note: always use explicit joins (with the on
keyword) instead of old-school, implicit joins (with commas in the from
clause), whose syntax is harder to read and maintain.