2013-04-09 2 views
0

У меня есть таблица SQL Server с 2 ID столбцами: Employee_ID & Type_IDВозврат уникальных строк в SQL Server 2008

Моя таблица содержит 4 строки:

Row 1 (Employee ID: 904, Type_ID: 3) 
Row 2 (Employee ID: 904, Type_ID: 7) 
Row 3 (Employee ID: 905, Type_ID: 7) 
Row 4 (Employee ID: 905, Type_ID: 7) 

Я хочу, чтобы вернуть все типа идентификаторов, которые доступны для всех сотрудников. Так что только ID 7.

Так что я хочу 1 строки вернуться с идентификатором 7, как она доступна как для сотрудников (90 905)

Если я запускаю следующий SQL:

SELECT 
    Type_ID, Count(Type_ID) as MyCount 
FROM 
    EmployeeType 
WHERE 
    Employee_ID IN (904, 905) 
GROUP BY 
    Type_ID 

Это возвращает мне 2 строки

Row 1 (Type_ID: 3, MyCount: 1) 
Row 2 (Type_ID: 7, MyCount: 3) 

Но я только то, что запись с наивысшим счетом (Type_ID 7). Я попытался добавить:

HAVING MAX(Count(CostCentre_ID)) 

Но это obvuiouly недопустимый код.

Как это сделать в моем SQL?

+1

«удаленный» означает, что «строка 2» имеет более новый тип ti mestamp, чем 'row 1' => перезаписывает старый' type_ID' 3 с новым значением - 7? или есть ли столбец 'row_id'? или как вы знаете порядок строк? – Aprillion

+0

Только что обновлено, извините, он должен был прочитать, если строка 1 была удалена. – Sun

+1

@ user1131657 Я не ошибаюсь в вашем текущем запросе. – Luv

ответ

2

Вдохновленный ответ Барри, чтобы получить вам правильный результат, даже если есть «дубликат» строки, как это:

declare @t table (
    employeeid int, typeid int, notes int 
) 
insert into @t 
    select 904, 3, 0 union 
    select 904, 5, 0 union 
    select 904, 5, 1 union 
    select 904, 7, 0 union 
    select 905, 7, 0 union 
    select 905, 7, 1 union 
    select 908, 3, 0 union 
    select 908, 5, 0 union 
    select 908, 7, 0 union 
    select 908, 9, 0 union 
    select 908, 3, 0 

Получить все typeid S, которые присутствующий для всех employeeid s:

select typeid 
from @t 
group by typeid 
having count(distinct employeeid) = (
    select count(distinct employeeid) 
    from @t) 
+0

Это работает для меня. Спасибо за помощь – Sun

2

Я предполагаю, что вы хотите найти TypeId присваивается всем EmployeeId.

Declare @t table 
(
EmployeeId int, 
TypeId int 
) 
Insert Into @t 
Select 904, 3 
Union 
Select 904, 5 
Union 
Select 904, 7 
Union 
Select 905, 5 
Union 
Select 905, 7 
Union 
Select 908, 3 
Union 
Select 908, 7 


Select Distinct a.TypeId 
From @t a 
Join 
(
    Select TypeId, 
      COUNT(*) Over(Partition by TypeId)as [Occurs] 
    From @t 
)b on a.TypeId = b.TypeId 

Where b.Occurs = (Select COUNT(Distinct(EmployeeId)) 
       From @t 
       ) 

7 Это возвращает, как это единственный TypeId назначается всем работникам.

+0

'и a.EmployeeId in (904, 905)' - или что такое '' 'таблица? – Aprillion

+0

@deathApril Я оставил фильтрацию на 'EmployeeId', так как я предполагаю, что может быть много сотрудников, поэтому запрос будет вычислять' TypeId', назначенный всем сотрудникам, независимо от того, сколько их там. – codingbadger

+0

так почему бы не начать с 'b' таблицы без' a'? – Aprillion

0

Не могли бы вы попробовать это:

SELECT Type_ID, Occurance FROM 
(
SELECT Type_ID, Count(Employee_ID) OVER (PARTITION BY Employee_ID) AS Occurance 
FROM EmployeeType 
) T 
WHERE T.Occurance > 2 
Смежные вопросы