简体   繁体   English

选择声明 - 仅在条件时

[英]Select Statement - Only when condition

Take a look in the table below: 看看下表:

Status ----------------- Email
Approved ----------------john@john.com 
Canceled --------------- john@john.com 
Canceled --------------- charles@charles.com 
Canceled --------------- charles@charles.com 
Canceled --------------- charles@charles.com 

I execute the query 我执行查询

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

Status ----------------- Email
Approved --------------- john@john.com 
Canceled ----------------john@john.com 
Canceled --------------- charles@charles.com 

I'd like to set up a query to select the rows that have the status "Canceled" ONLY WHEN there is not a row with the same email with the status "Approved". 我想设置一个查询来选择状态为“已取消”的行只有当没有一行具有状态为“已批准”的同一电子邮件时。

In other words, I'd to select only the last entry (Canceled - charles@charles.com) in this example. 换句话说,在这个例子中,我只选择最后一个条目(Canceled - charles@charles.com)。

Is it possible? 可能吗? Thanks in advance. 提前致谢。

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

Try this 试试这个

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

Assuming you have only 'Approved' and 'Cancelled' as values for Status column: 假设您只有'已批准'和'已取消'作为状态列的值:

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

You can use following queries: 您可以使用以下查询:

Method 1 : 方法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

Method 2: 方法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' )

If this is about cancelled emails only, you could try EXCEPT: 如果这只是关于取消的电子邮件,您可以尝试除以外:

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

or, if Status must be included in the output: 或者,如果Status必须包含在输出中:

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

If you actually meant to display emails that are either always approved or always cancelled, one way would be to repeat the above logic for each subset: 如果您实际上打算显示始终被批准或始终被取消的电子邮件,则一种方法是为每个子集重复上述逻辑:

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

Alternatively, however, you could try grouping and counting distinct Status values in the groups: 但是,您也可以尝试对组中的不同Status值进行分组和计数:

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

This other method would work for any number of possible Status es. 这种其他方法适用于任何数量的可能Status

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM