交易数据按客户聚合触达方式次数的SQL实现问题问询
解决按客户ID统计触达方式次数的SQL问题
看来你在尝试统计客户不同触达方式的次数时遇到了SQL报错的问题,我来帮你梳理下问题所在,再给出靠谱的解决方案。
首先咱们先拆解你原有SQL里的问题:
- 表名拼写失误:
d.emai应该是d.email(大概率是手滑打错了) - 子查询逻辑错误:
having SolicitMethod = 'Email'用法不对,HAVING是用来过滤聚合后的结果的,而SolicitMethod是每行的字段,要筛选特定触达方式应该用WHERE - 整体绕了远路:不需要嵌套子查询,用条件聚合就能一次性生成你需要的两列统计结果,效率还更高
正确解决方案:条件聚合
要实现按客户ID聚合,分别统计电话、邮件的触达次数,最直接的方法是用CASE表达式配合聚合函数(COUNT或SUM)做条件计数:
方法1:使用COUNT + CASE
CREATE TABLE d.customer_contact_summary AS SELECT ID, -- 统计邮件触达次数:仅当触达方式为Email时计数,自动忽略NULL COUNT(CASE WHEN SolicitMethod = 'Email' THEN 1 END) AS email_count, -- 统计电话触达次数:仅当触达方式为Phone时计数 COUNT(CASE WHEN SolicitMethod = 'Phone' THEN 1 END) AS phone_count FROM d.original_transaction_data -- 替换成你的原始交易数据表名 GROUP BY ID;
方法2:使用SUM + CASE
另一种等价的写法是用SUM,匹配触达方式时返回1,否则返回0,求和后就是对应次数:
CREATE TABLE d.customer_contact_summary AS SELECT ID, SUM(CASE WHEN SolicitMethod = 'Email' THEN 1 ELSE 0 END) AS email_count, SUM(CASE WHEN SolicitMethod = 'Phone' THEN 1 ELSE 0 END) AS phone_count FROM d.original_transaction_data GROUP BY ID;
逻辑说明
GROUP BY ID:将同一客户ID的所有行聚合为一行CASE WHEN ... THEN 1 END:针对每行判断触达方式,匹配时返回1,不匹配时返回NULL(COUNT会忽略)或0(SUM累加不影响结果)- 最终每个客户ID对应一行,包含各自的邮件、电话触达次数
内容的提问来源于stack exchange,提问作者HarsH GuptA
相关产品推荐
相关产品推荐

