如何在Oracle SQL中以单行显示相关记录?
我编写了一个连接两个表的查询,得到了以下结果集:如何在Oracle SQL中以单行显示相关记录?,sql,oracle,group-by,count,greatest-n-per-group,Sql,Oracle,Group By,Count,Greatest N Per Group,我编写了一个连接两个表的查询,得到了以下结果集: SELECT emp.employee_id, dept.department_name, dept.department_id FROM employee emp, department dept WHERE emp.department_id = dept.departme
SELECT emp.employee_id,
dept.department_name,
dept.department_id
FROM employee emp,
department dept
WHERE emp.department_id = dept.department_id;
但是,我需要在下面的输出中显示一个名为“状态”的新字段。标记可以在两个部门工作,因此计数为2,状态为“Y”。显示任何一条记录都可以。Justin只在一个部门工作,计数为1,状态应为“N”。金伯利在任何地方都不工作,计数为0,状态应为“N”
预期产出:
Employee_ID Department Department_ID Status
Mark Sales D1 Y
Justin Textiles D3 N
Kimberley (null) (null) N
请提供帮助。我知道您希望显示每个用户的第一个部门,并添加一个标志,指示该员工是否至少属于一个其他部门 您可以使用窗口功能:
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
旁注:始终使用带有on关键字的显式联接,而不是在from子句中使用带有逗号的老式隐式联接,其语法更难阅读和维护。我知道您希望显示每个用户的第一个部门,并添加一个标志,指示该员工是否属于至少一个其他部门 您可以使用窗口功能:
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
旁注:始终使用带有on关键字的显式连接,而不是在from子句中使用带有逗号的老式隐式连接,其语法更难阅读和维护。我认为使用带有max的group by和keep子句可以轻松实现这一点,如下所示:
SELECT emp.employee_id,
Max(dept.department_name) keep (dense_rank first order by dept.department_id) as department_name,
Max(dept.department_id) keep (dense_rank first order by dept.department_id) as department_id,
case when count(1) > 1 then 'Y' else 'N' end as status
FROM employee emp
LEFT JOIN department dept ON emp.department_id = dept.department_id
GROUP BY emp.employee_id;
干杯 我认为这可以通过使用group by和keep子句和max轻松实现,如下所示:
SELECT emp.employee_id,
Max(dept.department_name) keep (dense_rank first order by dept.department_id) as department_name,
Max(dept.department_id) keep (dense_rank first order by dept.department_id) as department_id,
case when count(1) > 1 then 'Y' else 'N' end as status
FROM employee emp
LEFT JOIN department dept ON emp.department_id = dept.department_id
GROUP BY emp.employee_id;
干杯