SQL Count Distinct返回一个额外的计数

时间:2020-07-28 05:41:17

标签: sql

这两种方法返回不同的结果怎么可能?

方法1 (返回正确的计数):

SELECT COUNT(DISTINCT contact_id)
FROM Traffic_Action
WHERE action_type IN ('Schedule a Tour', 'Schedule Follow-up', 'Lost') 

方法2 (返回一个额外的计数):

SELECT COUNT(DISTINCT CASE WHEN action_type IN ('Schedule a Tour', 'Schedule Follow-up', 'Lost') THEN contact_id ELSE 0 END)
FROM Traffic_Action

3 个答案:

答案 0 :(得分:2)

删除else part-同时也计为0

SELECT COUNT(DISTINCT CASE WHEN 
    action_type in ('Schedule a Tour','Schedule Follow-up','Lost') THEN contact_id END) 
FROM Traffic_Action

答案 1 :(得分:1)

难怪您会得到两种不同的结果。

第一个查询:

为您提供action_type in Schedule a Tour, Schedule Follow-up and Lost

处不同的记录数
SELECT    COUNT(DISTINCT contact_id) FROM    Traffic_Action WHERE   action_type in 
('Schedule a Tour','Schedule Follow-up','Lost') 

第二个查询:

在此查询中,除Schedule a Tour, Schedule Follow-up and Lost以外的任何值都被视为0,并且在采用不同的值时,根据您的case语句得出一行

SELECT    COUNT(DISTINCT CASE WHEN action_type in ('Schedule a Tour','Schedule Follow- 
up','Lost') THEN contact_id ELSE 0 END) FROM    Traffic_Action

简单地说,

在第一个查询中,您仅过滤三个值

在第二个查询中,您没有过滤器,但是有三个值的case语句,否则条件为不匹配的条件返回0

答案 2 :(得分:0)

这意味着您有1条记录,其中contact_id为NULL。通常,COUNT()会忽略NULL值。您的第二个查询通过“ ELSE”分支将NULL转换为零。这就是为什么您会看到与众不同的原因。

在此示例中,您可以快速看到自己。尽管有3条记录,这将返回2

select count(distinct a.col1)
from (
    select 1 as Col1
    union select 2
    union select NULL
) a
相关问题