如何在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;
干杯