0

有人可以简单地解释一下下面的代码吗结果?

谢谢这里....

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 ]
4

2 回答 2

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进行了很好的介绍。

下一部分是考虑 SELECT 列表。

这里有两件事应该让你停下来思考;首先是使用DISTINCT。这将过滤掉重复的记录。如此有效,如果基础数据中有两行具有完全相同的值,则输出将仅包含其中一行。

二是CASE语句的使用。作者在这里为数据添加了额外的含义;他们的意思是,例如:

当 filter3 字段为字符串“SB”时,查询应返回“EON”。

频道 ID 也是如此。

当人们想要将数据库字段转换为对查看查询结果的人来说有意义的值时,他们通常会这样做。他们还经常使用它来将结果值组合在一起。

目前的查询相当简单。如果我不得不猜测的话,我会说它带回了一个列表,其中列出了在许多客户的营销活动中发生的不同活动。

一旦您了解了架构和意图,剩下的就是 SQL。

我投票结束,因为这个问题太本地化了,但我希望这能帮助你理解架构和查询!

于 2012-08-21T12:01:04.203 回答
2

基本上,您正在从两个表中选择记录cam.campaign_activitycam.selection_log并且您正在对activity_id. AnINNER JOIN仅生成与两个表都匹配的记录集。(参见JOIN 的视觉解释

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
于 2012-08-21T12:04:15.643 回答