2016-06-01 1 views
1

Mein Tisch ist wie folgt:Ein interessanter heikel Filter (nicht wissen, wie es in Titel beschreiben)

Item Subitem Progress 
1  101  Complete 
1  102  Pending 
1  103  Pending 
2  201  Complete 
2  202  Complete 

Ich möchte die Elemente auszuwählen, deren Unterpunkte sind alle komplett --- in diesem Fall, Artikel # 2. Irgendeine Idee, wie man das macht? Danke!

+2

Mit anderen Worten: Sie wollen, dass alle Nachrichten, bei denen es keine Zeile mit Fortschritt existiert <> 'Complete'? –

+0

Mögliches Duplikat von [SQL - Zeilen mit allen Werten X von Spalte A = Wert B] (http://stackoverflow.com/questions/31481213/sql-get-rows-where-all-values-x-of-column) -a-Wert-b) –

Antwort

5

So viele Möglichkeiten:

select Item from T group by Item 
having min(Progress) = max(Progress) and max(Progress) = 'Complete' 

oder

having count(case when Progress = 'Complete' then 1 end) = count(*) 

oder

having count(case when Progress = 'Complete' then null else 1 end) = 0 /* handles nulls */ 

oder

select distinct Item from T t 
where 'Complete' = all (select Progress from T t2 where t2.Item = t.Item) 
+0

Vielen Dank !!!!!! Das ist Genie! –

2

Also, wollen Sie im Grunde alle Elemente, die

Angenommen, die Tabelle, die Sie Tabelle der SubItems gezeigt haben, in Pending Status keine Unterpunkte haben, und es ist ein weiterer Artikel Tisch ...

SELECT * 
FROM Items 
WHERE ITEMID NOT IN (SELECT ITEMID 
        FROM SubItems 
        WHERE Progress != 'Complete') 
+0

Sie wollen wahrscheinlich 'distinct'. – shawnt00

+0

Ich glaube nicht, dass das auf der Hauptauswahl notwendig ist. Ich denke, es könnte effizienter sein, es in der Unterabfrage zu haben. –

+0

Sie erhalten zwei Zeilen von Item 2 ohne es. – shawnt00

Verwandte Themen