2014-03-01 6 views
6

einen Blick in der Tabelle unten nehmen:Select Statement - Nur wenn die Bedingung

Status ----------------- Email 
Approved [email protected] 
Canceled --------------- [email protected] 
Canceled --------------- [email protected] 
Canceled --------------- [email protected] 
Canceled --------------- [email protected] 

ich ausführen, um die Abfrage

"SELECT DISTINCT Status, Email FROM dbo.sales": 

Status ----------------- Email 
Approved --------------- [email protected] 
Canceled [email protected] 
Canceled --------------- [email protected] 

Ich möchte eine Abfrage eingerichtet, um die Zeilen auszuwählen, die haben der Status „Abgebrochen“ nur, wenn es nicht eine Zeile mit der gleichen E-Mail mit dem Status „Approved“ ist.

Mit anderen Worten, würde ich nur den letzten Eintrag auszuwählen (Cancelled - [email protected]) in diesem Beispiel.

Ist es möglich? Danke im Voraus.

Antwort

1
Select distinct status,email 
From dbo.sales 
Where email Not In (select email from dbo.sales 
         Where status='Approved') 
0

Versuchen Sie, diese

Select Status, Email 
FROM dbo.sales 
WHERE Status = 'Canceled' AND 
NOT EXIST(Select Status, Email FROM dbo.sales Where Status='Approved') 
GROUP BY Status, Email 
0

Sie haben Unter der Annahme, nur 'Genehmigt' und 'Abgebrochen' als Werte für Spalte Status:

select status, email from dbo.sales 
where email not in (select email from dbo.sales where status = 'Approved') 
group by email 
0

können Sie folgende Abfragen verwenden:

Methode 1:

SELECT DISTINCT t.status, t.email 
FROM dbo.test t 
LEFT JOIN (SELECT * FROM test WHERE STATUS = 'Approved')z ON z.email = t.email 
WHERE t.STATUS = 'Canceled' 
    AND z.STATUS IS NULL 

Methode 2:

SELECT DISTINCT status, email 
FROM dbo.sales t 
WHERE t.STATUS = 'Canceled' 
    and t.email Not In ( SELECT email 
         FROM dbo.sales 
         WHERE status='Approved') 
0

Wenn dies über abgesagt E-Mails nur, könnten Sie versuchen, AUSSER:

SELECT Email FROM dbo.sales WHERE Status = 'Canceled' 
EXCEPT 
SELECT Email FROM dbo.sales WHERE Status = 'Approved' 
; 

oder, wenn Status muss in der Ausgabe enthalten sein:

SELECT Status,  Email FROM dbo.sales WHERE Status = 'Canceled' 
EXCEPT 
SELECT 'Canceled', Email FROM dbo.sales WHERE Status = 'Approved' 
; 

Wenn Sie tatsächlich angezeigt werden E-Mails zu verstehen, die entweder immer zugelassen sind oder immer abgebrochen, wäre eine Möglichkeit t sein o wiederholen Sie die Logik für jede Untergruppe:

(
SELECT Status,  Email FROM dbo.sales WHERE Status = 'Canceled' 
EXCEPT 
SELECT 'Canceled', Email FROM dbo.sales WHERE Status = 'Approved' 
) 
UNION ALL 
(
SELECT Status,  Email FROM dbo.sales WHERE Status = 'Approved' 
EXCEPT 
SELECT 'Approved', Email FROM dbo.sales WHERE Status = 'Canceled' 
) 
; 

Alternativ kann aber könnten Sie versuchen, Gruppierung und verschiedene Status Werte in den Gruppen zählen:

SELECT 
    MIN(Status) AS Status, 
    Email 
FROM 
    dbo.sales 
GROUP BY 
    Email 
HAVING 
    COUNT(DISTINCT Status) = 1 
; 

Dieses andere Verfahren für eine beliebige Anzahl von möglichen funktionieren würde Status es.