求助:使用CASE语句将email_type=1的email1Opened与email1Sent合并为单行
调整后的SQL查询方案
没问题,我来帮你把查询调整成符合需求的样子。你当前的语句会根据每条记录生成一行结果,导致同一个用户的email1Opened和email1Sent可能分散在不同行里。要把这两个状态合并到同一行,我们可以用聚合函数+分组的方式来实现:
SELECT user_id, business_id, -- 只要有一条符合条件的open记录,就返回YES,否则NO MAX(CASE WHEN email_status = 'open' AND email_type = 1 THEN 'YES' ELSE 'NO' END) AS email1Opened, -- 只要有一条符合条件的sent记录,就返回YES,否则NO MAX(CASE WHEN email_status = 'Sent' AND email_type = 1 THEN 'YES' ELSE 'NO' END) AS email1Sent FROM email_track WHERE business_id = 10 -- 按用户和业务ID分组,确保每个用户只显示一行 GROUP BY user_id, business_id;
为什么这么调整?
- 聚合函数MAX():因为
YES的字符串排序优先级比NO高,所以在同一个用户分组里,只要存在一条满足条件的记录,MAX()就会保留YES,否则返回NO,刚好实现“只要有过打开/发送行为就标记YES”的逻辑。 - GROUP BY分组:通过
user_id和business_id分组,确保每个用户(对应同一业务主体)的结果只出现在一行里。
如果你的场景里需要保留原查询中的id字段,由于每个分组可能对应多条记录的id,你可以用GROUP_CONCAT(id)来拼接所有相关id,或者根据业务需求选择某一个特定的id(比如最新的MAX(id))。
内容的提问来源于stack exchange,提问作者Maneesh Rao
相关产品推荐
相关产品推荐

