2017-02-22 2 views
1

Wie alle Zeilen mit Wert in einer Statusspalte (nicht null) Gruppe nach ID-Spalte abrufen.identifizieren Zeilen mit nicht null Werte in Sql

Id  Name Status 
1394 Test 1 Y 
1394 Test 2 null  
1394 Test 3 null  
1395 Test 4 Y 
1395 Test 5 Y 

Ich schrieb wie select * from table where status = 'Y'. Es bringt mir 3 Aufzeichnungen, wie man Bedingung hinzufügt, um nur letzte 2 hereinzubringen? Die ID 1394 hat zwei weitere Datensätze, deren Status Null ist.

Antwort

2

Ein einfacher Weg ist:

select * from mytable 
where status = 'Y' 
and id not in (select id from mytable where status is null) 
+0

Die Verwendung von "nicht in" -Klauseln, während ein "einfacher Weg" in der Regel nicht gut abläuft .... ein Outer-Join zur Sammlung von Nullstatus-IDs wird bevorzugt. – JasonInVegas

+0

@jason das ist einfacher zu verstehen und wenn das Datenvolumen massiv ist, wird dies gut funktionieren. Oft wird der Optimierer dies trotzdem in einen Join umwandeln, so dass die Performance mit einem codierten Join übereinstimmen kann. – Bohemian

3

Wenn Sie Gruppen wählen, in dem der Status nur y, können Sie tun:

select t.* 
from t 
where not exists (select 1 
        from t t2 
        where t2.id = t.id and 
         (t2.Status <> 'Y' or t2.status is null) 
       ); 

Wenn Sie nur die IDs wollen, würde ich verwenden group by und having:

select id 
from t 
group by id 
having min(status) = 'Y' and max(status) = 'Y' and count(*) = count(status); 

Die letzte Bedingung prüft auf keine NULL Werte.

Man könnte auch schreiben:

having min(status = 'Y' then 1 else 0 end) = 1 
0

Die vorhandene Abfrage "wo status = 'Y'" werden Sie nicht null definitions bringen.

Wenn Sie versuchen, gruppierte Ergebnisse zu erhalten, wird eine "GROUP BY id" -Klausel dies erreichen, was ebenfalls erfordert, dass id explizit in die select anstatt "*" gesetzt wird.

Beispiel: SELECT id, COUNT(id) from table where status = 'Y'

0

Wenn ich das richtig lese Sie in der ID für eine Gruppierung bringen wollen, die nie einen NULL-Statuswert hat:

würde ich eine Unterabfrage mit einem nicht existieren verwenden:

SELECT DISTINCT ID FROM mytable WHERE status IS NULL; 

Dann IDs filtern, die in dieser Liste nicht existieren:

SELECT * FROM mytable WHERE id NOT IN (SELECT DISTINCT ID FROM mytable WHERE status IS NULL); 
0

Hier sind einige mögliche Lösungen, weil ich genau unklar bin, was Sie als Ausgabe wünschen:

Select Id, Name, Status from table where status is not null; 

Ergebnisse in 3 Reihen:

Id  Name Status 
1394 Test 1 Y 
1395 Test 4 Y 
1395 Test 5 Y 


Select Id, count(*) as anAmt from table where status is not null group by Id; 
    /* only retrieves counts per Id */ 

Ergebnisse in 1 Zeile für jede Id:

Id   anAmt 
1394   1 
1395   2