包括一个值,但也在SQL中排除该值

时间:2016-09-01 00:01:33

标签: sql sql-server

表:客户

client        department  
Mike           1  
mike           2  
mike           3  
joe            1  
joe            2  
bill           1   
mary           2 

是否可以编写代码,找到仅在部门1或(部门1和2)但不在任何其他部门的客户?在这个例子中,只有乔和账单才是结果。我在退出/不存在时尝试过,但只有在我使用一个部门时才有效。

3 个答案:

答案 0 :(得分:2)

是的,您可以使用条件聚合:

SELECT client
FROM yourTable
GROUP BY client
HAVING SUM(CASE WHEN department IN (1, 2) THEN 1 ELSE 0 END) = COUNT(*) AND
       SUM(CASE WHEN department = 1 THEN 1 ELSE 0 END) > 0

HAVING子句的第一部分断言,对于给定的客户端,部门12出现,第二部分确保部门1至少出现一次。

在这里演示:

SQLFiddle

答案 1 :(得分:1)

以下是使用maxmin

的一个选项
select client 
from yourtable t
group by client
having min(department) = 1 and 
    max(department) in (1,2)

答案 2 :(得分:0)

数据样机:

DECLARE @t TABLE (clientName VARCHAR(20), deptId INT);
INSERT INTO @t
VALUES
    ('Mike', 1),
    ('Mike', 2),
    ('Mike', 3),
    ('Joe', 1),
    ('Joe', 2),
    ('Bill', 1),
    ('Mary', 2);

除了接近解决方案:

SELECT DISTINCT clientName
FROM @t
WHERE deptId = 1

EXCEPT

SELECT DISTINCT clientName
FROM @t
WHERE deptId > 2;