有人可以用简单的术语解释下面的代码吗,它今天早上落在我的办公桌上,我可以阅读它的一些内容,但其他部分只是让我感到困惑,请稍微简要介绍一下这段代码会返回什么在结果方面?
谢谢,这是......
drop table selection_all_journey purge;
create table selection_all_journey as
select distinct
ca.activity_id,
ca.campaign_code,
--ca.agent_activity_description,
case when sl.filter3 = 'DB' then 'RES'
when sl.filter3 = 'SB' then 'EON'
when ca.agent_activity_description = 'Additional DM' then 'Trial 6 - DM'
else ca.agent_activity_description end as agent_activity_description,
case when ca.channel_id = 'DM' then 'Direct Mail'
when ca.channel_id = 'EM' then 'Email'
when ca.channel_id = 'TS' then 'Outbound_Calling'
else ca.channel_id end as channel_id,
sl.ice_customer_id,
sl.account_reference,
sl.load_date,
sl.mail_date,
sl.filter1
from cam.campaign_activity ca
join cam.selection_log sl
on ca .activity_id = sl.activity_id [ OK ]
答案 0 :(得分:4)
使用SQL最好的办法是查看基础表;通常,JOIN条件或WHERE子句将使您深入了解过程的作者如何理解表之间的关系。
所以,从:
开始from cam.campaign_activity ca
join cam.selection_log sl on ca .activity_id = sl.activity_id
这就是所谓的INNER JOIN。
这里作者的目的是获取campaign_activity
中selection_log
中具有匹配行的所有行的列表。因此,此查询将根据具有匹配行的所有行进行选择日志匹配的活动ID。
Jeff Atwood对SQL JOIN's here进行了很好的介绍。
下一部分是考虑SELECT列表。
这里有两件事可以让你停下来思考;第一个是使用DISTINCT。这将过滤掉重复的记录。如此有效,如果底层数据中有两行具有完全相同的值,则输出将仅包含其中一行。
第二个是使用CASE语句。这里的作者为数据增加了额外的含义;他们所说的是,例如:
当filter3字段是字符串'SB'时,查询应该返回 'EON'。
频道ID也是一样。
当人们想要将数据库字段转换为对查看查询结果的人有意义的值时,人们通常会这样做。他们通常也会用它来将结果值组合在一起。
现在的查询相当简单;如果我不得不猜测,我会说它会带回一系列针对众多客户的营销活动所发生的不同活动。
一旦了解了架构和意图,其余的只是SQL。
我投票结束是因为问题太局部化了,但我希望这能为您提供一些理解模式和查询的帮助!
答案 1 :(得分:2)
基本上,您正在从两个表cam.campaign_activity
和cam.selection_log
中选择记录,并且您正在activity_id
进行内部联接。 INNER JOIN
仅生成与两个表匹配的记录集。 (见Visual Explanation of JOINs)
CASE
语句解释:
首先CASE
:
case when sl.filter3 = 'DB' then 'RES'
when sl.filter3 = 'SB' then 'EON'
when ca.agent_activity_description = 'Additional DM' then 'Trial 6 - DM'
else ca.agent_activity_description end as agent_activity_description
这告诉您要为agent_activity_description
获取哪个字段。
sl.filter3 = 'DB'
则值为'RES'
sl.filter3 = 'SB'
则值为'EOS'
ca.agent_activity_description = 'Additional DM'
,则值为“试用版6 - DM”ca.agent_activity_description
第二个CASE
:
case when ca.channel_id = 'DM' then 'Direct Mail'
when ca.channel_id = 'EM' then 'Email'
when ca.channel_id = 'TS' then 'Outbound_Calling'
else ca.channel_id end as channel_id,
这告诉您要为channel_id
获取哪个字段。
ca.channel_id = 'DM'
则值为'Direct Mail'
ca.channel_id = 'EM'
则值为'Email'
ca.channel_id = 'TS'
则值为'Outbound_Calling'ca.channel_id