一组中有SQL,但另一组中没有

时间:2018-07-23 16:05:50

标签: sql sql-server select

给出以下数据:

DECLARE @Data TABLE
(
    clientid INT,
    reqyear INT,
    status VARCHAR(10)
);

INSERT INTO @Data VALUES
(1, 2017, 'Recd'),
(1, 2018, 'Reject'),
(2, 2017, 'Recd'),
(3, 2017, 'Recd'),
(3, 2018, 'Request'),
(4, 2015, 'Recd'),
(4, 2017, 'Reject');

SELECT * FROM @Data;

我需要检索一份客户ID列表,在该列表中我们收到了一年的文档,但又被拒绝了一年。在此示例中,我只希望客户端1和4。

客户2无效,因为我们在一年内收到,但没有另一年的数据。

另外,由于我们在一年内收到但在另一年内仅请求(但未被拒绝),因此不会退回客户3。

如何为此编写SQL?

3 个答案:

答案 0 :(得分:3)

您可以计算出这两个客户中每个客户拥有的status个不同的数量:

SELECT   clientid
FROM     @Data
WHERE    status IN ('Recd', 'Reject')
GROUP BY clientid
HAVING   COUNT(DISTINCT status) = 2

SQLFiddle

答案 1 :(得分:2)

       SELECT distinct d1.clientid  
                FROM @Data d1 
                        join @Data d2 
                                on d1.status = 'Recd' 
                                    AND d2.status = 'Reject' 
                                    and d1.clientid = d2.clientid 
                                    and d1.reqyear != d2.reqyear  ;

答案 2 :(得分:0)

因此,您希望任何在另一行上具有拒绝但没有拒绝的客户端吗?

如果是这样:

select clientid
from @data d
group by clientid
having sum(case when status = 'Reject' then 1 else 0 end) not in (count(*), 0);