2016-05-11 8 views
0

ich eine Abfrage erstellen bin versucht, dieSQL Query Zeilen zu filtern, um eine Sub-Abfrage verwenden, die die gleiche Tabelle abfragt

Ich versuche
TableA 

Id status  type  date 
300 approved  ACTIVE 11/12/2015 10:00:00 
300 approved  ACTIVE 11/12/2015 10:10:00 
300 approved  INACTIVE 11/12/2015 11:00:00 
200 approved  ACTIVE 11/12/2015 11:10:00 
200 approved  INACTIVE 11/12/2015 11:10:00 
100 approved  ACTIVE 11/12/2015 11:10:00 

Aus der obigen Tabelle Zeilen basierend auf anderen Zeilen wie im folgende Beispiel filtert Um IDs zurückzugeben, die die gleiche Anzahl von ACTIVE- und INACTIVE-Typen wie ID 300 haben, hat zwei Zeilen den Typ ACTIVE und eine Zeile den Typ INACTIVE, daher sollte ID 300 von meinen Ergebnissen ausgeschlossen werden, da 200 1 aktiv und 1 inaktiv hat in den Ergebnissen enthalten

In der oben genannten Tabelle Status, Typ kann andere Werte zu haben, aber ich interessiere mich nur für die oben aufgeführten ignorieren andere

Also, für TableA endgültige Ergebnis der Abfrage würde

Id 
200 

Ich habe versucht, die unter Abfrage laufen, aber dass nur knapp sein Ziel geben Sie mir die Ergebnisse, die ich

SELECT Id 
FROM TableA oa 
WHERE oa.type in('ACTIVE','INACTIVE') 
and oa.status='APPROVED' 
and not EXISTS(SELECT 
      x.id 
      ,COUNT(*) 
     FROM (SELECT DISTINCT 
       id 
       ,c.type 
      FROM TableA c 
      WHERE 
      AND c.type IN ('ACTIVE','INACTIVE') 
      AND c.status = 'APPROVED' 
      AND c.Id= ta.Id 
      )x 
     GROUP BY x.Id 
     HAVING COUNT(*) = 1) 

kann die obige Abfrage erwartet korrigiert werden, um die gewünschten Ergebnisse zu erhalten?

Antwort

3

Sie müssen nur SUM und HAVING verwenden:

SELECT Id 
FROM TableA 
WHERE 
    status = 'approved' 
    AND type In ('ACTIVE', 'INACTIVE') 
GROUP BY Id 
HAVING 
    SUM(CASE WHEN type = 'ACTIVE' THEN 1 ELSE 0 END) = 
    SUM(CASE WHEN type = 'INACTIVE' THEN 1 ELSE 0 END) 
+0

Danke und wie die Abfrage bearbeite ID in den Fällen auch enthalten, wenn ACTIVE s größer als Inaktiven? – DoIt

+0

Ändern Sie das letzte "=" in ">" – kmoser

+0

Verwenden Sie> =, um beide einzuschließen. – PhillipXT

Verwandte Themen