2016-07-25 8 views
1

existiert ich & Gruppe Id & Pid, wenn mindestens 1 für jede Pid in Id hat IsExists=1SQL-Select & Gruppe, wenn mindestens ein

Id  Pid  Opt IsExists 
27  2  107 1 
27  2  108 0 
27  5  96  1 
51  9  17  1 
51  9  18  0 
51  10  112 0 
758  25  96  0 
758  97  954 1 
758  194 2902 1 
758  194 2903 1 

Das Ergebnis sollte sein, auswählen müssen:

Id IsExists 
27  1  
  • Im Ergebnis für [id=27 | pid=2] & für [id=27 | pid=5] hat mindestens 1 mit isExists=1

Ist es möglich?

+0

Welche RDBMS verwenden Sie? –

+0

Ich verwende SQL Server – Eyal

+0

Kann eine ID nur eine PID zugeordnet haben? Also für ID = 27 PID = 2 und sonst nichts. – objectNotFound

Antwort

2

Ein Verfahren verwendet zwei Ebenen von Aggregation:

select id 
from (select id, pid, max(isexists) as max_isexists 
     from t 
     group by id, pid 
    ) t 
having count(*) = sum(max_isexists); 

Dies setzt voraus, dass isexists auf den Werten 0 und 1 nimmt

Eine Alternative verwendet nur eine Aggregationsniveau ist aber etwas komplizierter, unter Verwendung von count(distinct):

select id 
from t 
group by id 
having count(distinct pid) = count(distinct case when isexists = 1 then pid end); 
+0

Brauchen Sie nicht 'distinct' in der zweiten' count'? Oder gibt es nur eine pro Gruppierung? – shawnt00

+0

@ sawnt00. . . Ja. –

+0

Ich denke, Ihre Abfrage hat ein Problem (ich habe die zweite verwendet). wenn Pid = 0 und es ist nur einmal aufgeführt. Ich bearbeite meine Frage: Für Id = 758, Pid = 25 IsExists = 0 aber diese ID ist im Ergebnis der Abfrage aufgeführt. Übrigens, vielen Dank! – Eyal

1

Sie benötigen eine verschachtelte Aggregation:

select Id 
from 
(
    select Id, Pid, 
     -- returns 1 when value exists 
     max(IsExists) as maxExists 
    from tab 
    group by Id, Pid 
) as dt 
group by Id 
    -- check if all Pid got a 1 
having min(maxExists) = 1 
0

Try this ... es die innere Gruppe verwendet, die durch die unterschiedlichen Zählungen von IsExists von ID und PID und die äußere Kontrollen zu bekommen, wenn es 2 oder mehr

SELECT ID, 1 as IsExists FROM 
(
    select ID, PID , Count(Distinct IsExists) as IsExists 
    FROM 
    (

     Select 27 as ID , 2 as PID , 1 as IsExists UNION ALL 
     Select 27 as ID , 2 as PID , 0 as IsExists UNION ALL 
     Select 27 as ID , 5 as PID , 1 as IsExists UNION ALL 
     Select 51 as ID , 9 as PID , 1 as IsExists UNION ALL 
     Select 51 as ID , 9 as PID , 0 as IsExists UNION ALL 
     Select 51 as ID , 10 as PID , 0 as IsExists 

    ) a 
    WHERE IsExists = 1 
    Group by ID, PID 
) B 
GROUP BY B.ID 
Having Count(*) >= 2 
Verwandte Themen