2016-06-18 4 views
1

У меня есть таблица в следующей структуре.Как написать SQL-запрос для следующего сценария

Group Member/Owner Type 

G1  M1   Member 
G1  OW1   Owner 
G2  OW1   Owner 
G3  OW1   Owner 
G3  OW2   Owner 
G4  M2   Member 
G4  OW2   Owner 

Теперь я хочу запросить все Группы, у которых есть только Владелец, и не имеют ни одного члена.

Необходимый запрос должен возвращать группы G2 и G3 для приведенных выше таблиц, поскольку он имеет только владелец и ни одного члена.

Может ли кто-нибудь помочь мне достичь этого?

ответ

3

Вы можете сделать это с помощью агрегации и having:

select [group] 
from t 
group by [group] 
having min(type) = 'Owner' and max(type) = 'Owner'; 

Это говорит о том, что минимальное и максимальное значение type является 'Owner' - это означает, что значение всегда 'Owner' (или, возможно, NULL).

В качестве альтернативы, вы можете выразить пункт having как:

having sum(case when type = 'Member' then 1 else 0 end) = 0 
+0

Благодаря @Gordon Linoff – kombsh

0
Select [group] from 
    (
Select [group], 
sum(case when type='member' then 1 else 0 end) as cntmember, 
    sum(case when type='owner' then 1 else 0 end) as cntowner 
    from tab group by [group]) tab 
    where cntmember=0 and cntowner=1 
0

Использование Left Outer Регистрация:

SELECT G1 FROM 

    (SELECT GROUPS G1, TYPE T1 FROM temp 
    WHERE TYPE = 'Owner') TAB1 
     LEFT JOIN 
    (SELECT GROUPS G2, TYPE T2 FROM temp 
    WHERE TYPE = 'Member') TAB2 
     ON TAB1.G1 = TAB2.G2 

WHERE T2 IS NULL 
GROUP BY G1; 
0
declare @Table1 TABLE 
    (Groups varchar(2), Owner varchar(3), Type varchar(6)) 
; 

INSERT INTO @Table1 
    (Groups, Owner, Type) 
VALUES 
    ('G1', 'M1', 'Member'), 
    ('G1', 'OW1', 'Owner'), 
    ('G2', 'OW1', 'Owner'), 
    ('G3', 'OW1', 'Owner'), 
    ('G3', 'OW2', 'Owner'), 
    ('G4', 'M2', 'Member'), 
    ('G4', 'OW2', 'Owner') 
; 

;WITH CTE AS (
Select T.Groups,T.Type,T.Owner from (
select Groups, Owner, Type,ROW_NUMBER()OVER(PARTITION BY Groups ORDER BY Type)RN from @Table1 
)T WHERE T.RN = 1 AND T.Type <> 'member') 

Select * from @Table1 T WHERE EXISTS (Select 1 from CTE WHERE Groups = T.Groups) 
Смежные вопросы