【问题标题】:Oracle Grouping and Duplicate CheckingOracle 分组和重复检查
【发布时间】:2016-01-15 16:46:38
【问题描述】:

我一直在摸索这个。

这个问题让我更接近了,但我的情况有点复杂。 How do I find duplicate values in a table in Oracle?

假设我有一个表 EMPLOYEE,我想知道哪些员工在多个部门工作。我的表有员工ID,以及他们工作的部门。当员工在多个部门工作时,他们的员工ID将被列为多条记录。我不想只计算列出两次的员工。我需要知道这个部门列表和这个部门列表中有多少工作。

例如,如果我的表是:

 Employee ID | Department
 1             Accounting
 1             Marketing
 2             Accounting
 3             Finance
 4             Programming

部门列表A是

  • 会计
  • 财务

部门列表B是

  • 营销
  • 编程

那么查询的结果就是

 Employee ID | Department
 1             Accounting
 1             Marketing

 Employee ID | Count(Department)
 1             2

因为员工 1 在列表 A 和列表 B 中的一个部门工作。

【问题讨论】:

  • 你比较的部门列表有什么变化?
  • 我认为您应该添加更多示例来明确您想要什么。包括输入参数,最好是单一的预期输出格式。 2或3个这样的例子会让你的问题更简单。

标签: sql oracle


【解决方案1】:

我会用映射来解决这个问题:

with mapping as (
      select 'Accounting' as department, 'A' as grouping from dual union all
      select 'Finance' as department, 'A' as grouping from dual union all
      select 'Marketing' as department, 'B' as grouping from dual union all
      select 'Programming' as department, 'B' as grouping from dual
     )
select employeeid, count(distinct m.grouping)
from t join
     mapping m
     on t.department = m.department
group by employeeid;

注意:您可能希望将此信息存储在另一个表中或作为Departments 表中的属性。

如果您希望单独的部门映射到自己:

select t.employeeid, count(distinct coalesce(m.grouping, t.department))
from t join
     mapping m
     on t.department = m.department
group by t.employeeid;

如果您希望将表中没有的其他部门分组在一起:

select t.employeeid, count(distinct coalesce(m.grouping, 'UNKNOWN MAPPING'))
from t join
     mapping m
     on t.department = m.department
group by t.employeeid;

【讨论】:

    【解决方案2】:

    如果我了解您的需求,您可以在 HAVING 子句中为此使用条件聚合:

    SELECT Employee_ID, COUNT(DISTINCT Department) AS Dept_Count
    FROM YourTable
    GROUP BY Employee_ID
    HAVING MAX(CASE WHEN Department IN ('Accounting','Finance') THEN 1 ELSE 0 END) = 1
      AND  MAX(CASE WHEN Department IN ('Marketing','Programming') THEN 1 ELSE 0 END) = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-15
      • 2016-01-22
      • 1970-01-01
      • 2013-08-22
      • 1970-01-01
      • 2019-04-23
      • 2018-04-06
      • 1970-01-01
      相关资源
      最近更新 更多