SQL Server统计昨日新增客户及无邮箱客户数的子查询问题求助
搞定昨日新增客户的邮箱统计问题
我看了你写的SQL,发现几个小问题导致统计结果不符合预期,咱们一步步来修正:
首先,你代码里的GETDATE()-10应该是手滑写错了吧?要筛选昨日的客户,得改成取昨日的日期范围,而且用日期截断的方式更稳妥,避免DATE_ADDED带时间部分导致匹配不上。
另外,你用内连接子查询的话,会把有邮箱的客户都过滤掉,根本没法统计总客户数。咱们换个思路,用左连接+CASE WHEN的方式,既能保留所有昨日新增客户,又能统计出其中无主邮箱的数量。
修正后的SQL代码
SELECT c.ADDED_BY AS CSR专员, COUNT(DISTINCT c.ACCT_NO) AS 总客户数, COUNT(DISTINCT CASE WHEN ct.EMAILADDR1 = '' THEN c.ACCT_NO END) AS 无主邮箱客户数 FROM CLIENT c LEFT JOIN CONTACT ct ON c.ACCT_NO = ct.ACCT_NO AND ct.[PRIMARY] = 'A' -- 只关联主联系人记录 WHERE -- 精准匹配昨日的所有客户,不受时间部分干扰 c.DATE_ADDED >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) AND c.DATE_ADDED < CAST(GETDATE() AS DATE) GROUP BY c.ADDED_BY ORDER BY c.ADDED_BY;
为啥这么写?
- 日期筛选:用
CAST(GETDATE() AS DATE)把当前时间转成纯日期,再减1天得到昨日的起始时间,加上小于今日起始时间的条件,确保所有昨日新增的客户(不管是凌晨还是晚上添加的)都能被统计到。 - 左连接CONTACT:这样即使客户有主邮箱或者没有主联系人记录,也不会被过滤掉,保证总客户数是准确的。
- CASE WHEN统计无邮箱:只有当主联系人的邮箱为空时,才把这个客户计入
无主邮箱客户数,用COUNT(DISTINCT)防止一个客户多条记录重复计数(按业务逻辑PRIMARY='A'应该是唯一的,但加上更保险)。 - 分组排序:按CSR专员分组后,你就能一眼看到每个专员的总新增数和漏填邮箱的数量了。
如果你习惯用子查询的方式,也可以试试下面这个版本,结果是一样的:
SELECT c.ADDED_BY AS CSR专员, COUNT(DISTINCT c.ACCT_NO) AS 总客户数, ISNULL(x.NoEmailCount, 0) AS 无主邮箱客户数 FROM CLIENT c LEFT JOIN ( SELECT ct.ACCT_NO, COUNT(DISTINCT ct.ACCT_NO) AS NoEmailCount FROM CONTACT ct WHERE ct.EMAILADDR1 = '' AND ct.[PRIMARY] = 'A' GROUP BY ct.ACCT_NO ) x ON c.ACCT_NO = x.ACCT_NO WHERE c.DATE_ADDED >= DATEADD(DAY, -1, CAST(GETDATE() AS DATE)) AND c.DATE_ADDED < CAST(GETDATE() AS DATE) GROUP BY c.ADDED_BY, x.NoEmailCount ORDER BY c.ADDED_BY;
不过第一种写法更简洁高效,不用额外的子查询关联,推荐用这个~
内容的提问来源于stack exchange,提问作者Mary Mahoney
相关产品推荐
相关产品推荐

