2017-01-23 6 views
1

Slowly Changing Dimension Type 2をT-SQLで実装しようとしていますが、要求をどのように処理するかを理解できません。SQL Server - 緩やかに変化するディメンションに2つ以上の条件がある場合のマージステートメントの使用方法

表カラム:cpfnometelefone_updateendereco_insert

基本的にロジックがある:MATCHは、レコードが挿入されなければならないcpfを使用して発生しない場合、 MATCHが発生したにもかかわらず、telefone_updateフィールドだけが変更されている場合、別のレコードは必要ありません。値を更新して上書きしたいだけです。 MATCHが発生したにもかかわらずendereco_insertフィールドのみが変更された場合は、新しいレコードを追加して開始日と終了日を更新したいと考えています。

insert into #dm_lucas_tst ( 
           [cpf], 
           [nome], 
           [telefone_update], 
           [endereco_insert], 
           [dt_scd_start], 
           [dt_scd_end], 
           [nu_scd_version] 
          ) 
select [cpf], 
     [nome], 
     [telefone_update], 
     [endereco_insert], 
     cast(dateadd(month, datediff(month, 0, getdate()), 0) as date) as [dt_scd_start], 
     '2199-12-31' AS [dt_scd_end], 
     1 AS [nu_scd_version] 
from (
      merge edw.dim.dm_lucas_tst as Target 
      using edw.dim.stg_lucas_tst as Source 
       on Target.cpf = Source.cpf 
      when not matched by target 
      then 
       insert (
         [cpf], 
         [nome], 
         [telefone_update], 
         [endereco_insert], 
         [dt_scd_start], 
         [dt_scd_end], 
         [nu_scd_version] 
         ) 
       values (
         Source.[cpf], 
         Source.[nome], 
         Source.[telefone_update], 
         Source.[endereco_insert], 
         cast(dateadd(month, datediff(month, 0, getdate()), 0) as date), 
         '2199-12-31', 
         1 
         ) 
      when matched 
      and Source.telefone_update <> Target.telefone_update 
      and Target.dt_scd_end = '2199-12-31' 
      then 
       update set telefone_update = Source.telefone_update 
      output $ACTION ActionOut, 
         Source.[cpf], 
         Source.[nome], 
         Source.[telefone_update], 
         Source.[endereco_insert]     
     ) AS MergeOut 
where MergeOut.ActionOut = 'UPDATE'; 

しかし、私はその作業を行います別のWHEN MATCH AND ...を置くとは思わない:

は、私がこれまで持っていることです。

提案がありますか?

ありがとうございます!

あなたの説明にしたがって
+0

こんにちは@Lucas、この問題を解決しましたか? –

+0

@KamilNowinskiは本当にありません。私は上に移動し、新しい行を挿入することを決めました。 –

+0

こんにちは@Lucas、私が下で提示した解決策は助けになるでしょうか? –

答えて

0

、私はあなたが必要と仮定している:私は「列の[telefone_update]

  • SCDタイプ2 [endereco_insert]
  • 列の

    • SCDタイプ1アプリケーションSCDマージウィザードを使用して、記述されたロジックを簡単に作成できます。 私はそれをテストしました - すべてが期待どおりに見えると思います。 私は自分のブログでこのプロセスを説明しました。一見して、それがあなたが望んだものだったかどうか教えてください。

      https://sqlplayer.net/2018/01/scd-type-1-type-2-in-merge-statement/

    関連する問題