我试图确定我的数据库中的哪些人要么取消订阅我的新闻信件,哪些人有错误的电子邮件地址,哪些人也没有。我有iUnsub'和'iBadEmail'的活动。
我写的代码是
select distinct
n.id,
'Unsubscribe' =
case
when a.activity_type = 'iUnsub' then '1'
end,
'Bad Email' =
case
when a.activity_type = 'iBadEmail' then '1'
end
from name n
left join activity a on n.id = a.id
where n.id in
(
'1002421',
'1005587',
'1009073',
'1001102'
)
我收到的结果会为每个ID创建2个结果
id Unsubscribe Bad Email
1001102 NULL NULL
1002421 NULL NULL
1002421 1 NULL
1005587 NULL NULL
1005587 1 NULL
1009073 NULL 1
1009073 NULL NULL
我想代码只为每个id给我一行,如下所示
id Unsubscribe Bad Email
1001102 NULL NULL
1002421 1 NULL
1005587 1 NULL
1009073 NULL 1
答案 0 :(得分:0)
问题是您有多个活动行3或您的名字,并且您在每个活动的结果中返回一行。名称1001102要么没有,要么只有一个既不是Unsub也不是BadEmail的活动。
select n.Id,
sum(case when a.activity_id = 'iUnSub' then 1 else 0 end) UnSub,
sum(case when a.activity_id = 'iBadEmail' then 1 else 0 end) BadEmail
from name
left outer join activity a on n.id = a.id
where a.activity
and n.id in
(
'1002421',
'1005587',
'1009073',
'1001102'
)
group by n.Id
如果UnSubbed或BadEmail,这将给你一个非零数字,如果两者都是0,那么它可能是正确的。
left outer join
适用于名称没有活动行的情况。如果您不包含它,那么它们将不会包含在输出中。如果没问题,请将其更改为内部联接。