2016-01-15 2 views
0

Я почесал голову над этим.Oracle Grouping and Duplicate Checking

Этот вопрос меня ближе, но моя ситуация немного сложнее. How do I find duplicate values in a table in Oracle?

Предположим, у меня есть таблица EMPLOYEE, и я хочу знать, какие сотрудники работают в нескольких отделах. В моей таблице есть идентификатор сотрудника и отдел, в котором они работают. Когда сотрудник работает в нескольких отделах, их идентификатор сотрудника будет указан как несколько записей. Я не хочу просто считать сотрудников, которые перечислены дважды. Мне нужно знать, как много работает в этом списке отделов по сравнению с этим списком отделов.

Так, например, если мой стол:

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

И Департамент Список А

  • Учет
  • Финансы

и универмаги список Б является

  • Маркетинг
  • Программирование

Затем результаты запроса будет

Employee ID | Department 
1    Accounting 
1    Marketing 

или

Employee ID | Count(Department) 
1    2 

начиная с сотрудников 1 работает в отделе из списка А и список В .

+0

В списках отделов, которые вы сравниваете это какие изменения? –

+0

Думаю, вы должны добавить еще несколько примеров, чтобы точно определить, что вы хотите. Включая входной параметр и предпочтительно один ожидаемый выходной формат. 2 или 3 примера, подобные этому, сделают ваш вопрос намного проще. –

ответ

2

Я хотел бы подойти к этому с отображением:

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; 
1

Если я понимаю, что вы после этого, вы можете использовать условную агрегацию в предложении 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