You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:04:57