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 リストを検討することです。

ここで、ちょっと考えてみてほしいことが 2 つあります。1 つ目はDISTINCTの使用です。これにより、重複するレコードが除外されます。つまり、基になるデータにまったく同じ値を持つ 2 つの行がある場合、出力はそれらの行の 1 つだけで構成されます。

2 つ目は、CASEステートメントの使用です。ここで著者は、データに特別な意味を追加しています。彼らが言っているのは、たとえば次のようなものです。

filter3 フィールドが文字列「SB」の場合、クエリは「EON」を返す必要があります。

チャンネルIDも同様です。

これは、データベース フィールドを、クエリの結果を見ている人にとって意味のある値に変換したい場合によく行われます。多くの場合、結果の値をグループ化するためにも使用します。

現状のクエリはかなり単純です。推測するなら、それは多くのクライアントのマーケティング キャンペーンで発生した個別の活動のリストを復活させていると言えます。

スキーマと意図を理解したら、残りは単なる SQL です。

質問があまりにもローカライズされているため、閉じることに投票しましたが、これがスキーマとクエリを理解する上で役立つことを願っています!

于 2012-08-21T12:01:04.203 に答える
2

cam.campaign_activity基本的に、2 つのテーブルからレコードを選択cam.selection_logし、activity_id. INNER 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

2番目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 に答える