2014-03-01 44 views
6

采取如下表一看:Select语句 - 只有当条件

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

我执行查询

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

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

我想建立一个查询,选择具有行状态“已取消”,只有当没有同一电子邮件的状态为“已批准”时。

换句话说,在本例中,我只选择最后一项(取消 - [email protected])。

可能吗?提前致谢。

回答

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

试试这个

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

假设你只有 '认可' 和 '取消' 作为状态列中的值:

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

您可以使用下面的查询:

方法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 

方法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

如果这是关于取消邮件而已,你可以尝试,除了:

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

,或者,如果Status必须包括在输出:

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

如果您确实想要显示始终被批准或始终被取消的电子邮件,则有一种方法是o重复上述逻辑对于每个子集:

(
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' 
) 
; 

然而,或者,可以尝试分组和在各组计数不同Status值:

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

该其他方法将用于任何数目的可能的工作Status es。