1

我正在 SQL Server 中运行查询,以计算澳大利亚州数据库中存在的唯一电子邮件地址的数量。但是,当我尝试核对这些数字以确保它们正确时,我注意到了一个差异,这让我认为我的查询不正确。以下是我用来协调数字和实际结果的查询:

/** Count the total number of active members (status=1) since last night **/
SELECT count(distinct(email)) Total FROM [member] WHERE status = 1 
AND (created_datetime <= '2013-01-11' OR created_datetime IS NULL)
/** RESULT: 8958 **/

/** Count the number of active members (status=1) who live in Victoria since last night **/
SELECT count(distinct(email)) Total FROM [member] WHERE status = 1 
AND (created_datetime <= '2013-01-11' OR created_datetime IS NULL)
AND [state] = 'vic'
/** RESULT: 7545 **/

/** Count the number of active members (status=1) who don't live in Victoria since last night **/
SELECT count(distinct(email)) Total FROM [member] WHERE status = 1 
AND (created_datetime <= '2013-01-11' OR created_datetime IS NULL)
AND [state] <> 'vic'
/** RESULT:1446 **/

/** Add the two results to see how they compare to the total **/
SELECT 7545+1446
/** RESULT:8991 **/

您会注意到不同电子邮件的总数为 8958,但如果您将居住在维多利亚的电子邮件和不在维多利亚的电子邮件相加,则数字为 8991,这是不同的。我是否错误地使用了 count distinct 功能?

4

4 回答 4

2

where 子句中的 created_datetime 不同。在第一个查询中是

WHERE status = 1 
AND (created_datetime <= '2013-01-10 23:59:59' OR created_datetime IS NULL)

对于其他两个查询,它是

WHERE status = 1 
AND (created_datetime <= '2013-01-31 00:00:00' OR created_datetime IS NULL)
AND [state] <> 'vic'

拉吉

于 2013-01-11T05:59:52.867 回答
2

除了@Raj 和@MarkD 提供的答案之外,我还想添加另一个观察结果。
不应该

OR created_datetime IS NULL

只出现在其中一个陈述中而不是两个陈述中?如果两者都存在,则会出现重复,并且“总”查询的结果将永远不会与单个查询的总和相匹配。

于 2013-01-11T06:04:49.880 回答
2

您正在计算不同的电子邮件。如果来自 Victoria 的用户的电子邮件与来自其他地方的用户的电子邮件相同,那么这些将在总数中计为 1。

当分别计算维多利亚和非维多利亚的电子邮件时,在每种情况下都将再次计为 1,给您总共 2(如果您敢将它们加起来),这将是您现在遇到的差异。

于 2013-01-11T07:45:20.340 回答
1

您的 s 的余额[State]可能是NULL 正如 Raj 指出的那样,DATETIME您的查询不同。

SELECT count(distinct(email)) Total FROM [member] WHERE status = 1 
AND (created_datetime <= '2013-01-31 00:00:00' OR created_datetime IS NULL)
AND [state] IS NULL
于 2013-01-11T06:00:59.620 回答