2017-11-02 8 views
1

ITMBPSの詳細値が重複している場合、両方の部分からBOMSEQ_0、CPNITMREF_0、YREF_0、およびTEXTE_0の値をNULLにしようとしています。SQL - 重複した特定の値をnullに置き換える方法

SELECT B.BOMSEQ_0, case when B1.ITMREF_0 IS NOT NULL then NULL else B.CPNITMREF_0 end as CPNITREF, case when B1.ITMREF_0 IS NOT NULL then NULL else B.YREF_0 end as YREF, case when B1.ITMREF_0 IS NOT NULL Then NULL else CONVERT(varchar(255), T.TEXTE_0) end as TEXTE, case when B1.CPNITMREF_0 IS NOT NULL then NULL else I.YSTOFCY_0 end as YSTOFCY, case when B1.CPNITMREF_0 IS NOT NULL then NULL else I.PIO_0 end as PIO, case when B1.CPNITMREF_0 IS NOT NULL then NULL else I.BPSNUM_0 end as BPSNUM, case when B1.CPNITMREF_0 IS NOT NULL then NULL else I.ITMREFBPS_0 end as ITMREFBPS, 
      B1.BOMSEQ_0, B1.CPNITMREF_0, B1.YREF_0, CONVERT(varchar(255), T.TEXTE_0) as TEXTE2, I.YSTOFCY_0, I.PIO_0, BPSNUM_0, I.ITMREFBPS_0 
    FROM [BOMD] B 
    INNER JOIN [BOMD] B1 
    ON B.CPNITMREF_0=B1.ITMREF_0 
    AND B.BOMALT_0=B1.BOMALT_0 
    LEFT JOIN [TEXCLOB] T 
    ON B1.BOMTEXNUM_0=T.CODE_0 
    INNER JOIN [ITMBPS] I 
    ON B1.CPNITMREF_0=I.ITMREF_0 
    WHERE B.ITMREF_0='50' 
     and B.BOMALT_0= 1 
    UNION ALL 
    SELECT B.BOMSEQ_0, B.CPNITMREF_0, B.YREF_0, CONVERT(varchar(255), T.TEXTE_0), I.YSTOFCY_0, I.PIO_0, I.BPSNUM_0, I.ITMREFBPS_0, 
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL 
    FROM [BOMD] B 
    LEFT JOIN [TEXCLOB] T 
    ON B.BOMTEXNUM_0=T.CODE_0 
    INNER JOIN [ITMBPS] I 
    ON B.CPNITMREF_0=I.ITMREF_0 
    WHERE B.ITMREF_0='50' 
     and B.BOMALT_0= 1 
    ORDER BY B.BOMSEQ_0, B1.BOMSEQ_0, YSTOFCY, YSTOFCY_0, PIO, PIO_0 

私はラグを使用しようとしましたが、動作させることができません。 編集:データと結果の例(わずかに短くなっていますが、うまくいけばそのアイデアを得ることができます)。

BOMD 
    ITMREF_0 CPNITMREF_0 BOMSEQ_0 BOMALT_0 YREF_0 BOMTEXNUM 
     50  120-001  1  1  F1 1 
     50  112-001  2  1  F2 
     50  110-001  3  1  F3 
     112-001 113-001  1  1  P2 
     112-001 113-002  2  1  P3 2 
     50  120-001  1  2  D1 
     50  112-001  2  2  D2 
     50  110-001  3  2  D3 
     112-001 113-001  1  2  Q2 
     112-001 113-004  2  2  Q3 



TEXTCLOB 
     CODE_0 TEXTE_0 
     1  F1-10 
     2  P3-10 

ITMBPS 
     ITMREF_0 YSTOFCY_0 BPSNUM_0 PIO_0 
     120-001 UK  UK001 0 
     120-001 GER  GER001 2 
     112-001 UK  UK002 0 
     112-001 GER  GER002 2 
     110-001 GER  GER002 0 
     113-001 GER  GER002 0 
     113-001 UK  UK001 2 
     113-002 UK  UK003 0 

望ましい結果

BOMSEQ CPNITMREF YREF BOMTEXNUM BPSNUM BOMSEQ CPNITMREF YREF BTEX BPSNUM 
1  120-001 F1 F1-10  UK001 NULL NULL  NULL NULL NULL 
NULL NULL  NULL NULL  GER001 NULL NULL  NULL NULL NULL  
2  112-001 F2 NULL  UK002 NULL NULL  NULL NULL NULL 
NULL NULL  NULL NULL  GER002 NULL NULL  NULL NULL NULL 
NULL NULL  NULL NULL  NULL 1  113-001 P2  NULL GER002 
NULL NULL  NULL NULL  NULL NULL NULL  NULL NULL UK001 
NULL NULL  NULL NULL  NULL 2  113-002 P3  P3-10 UK003  
3  110-001 F3 NULL  GER002 NULL NULL  NULL NULL NULL 

任意のアイデア? ありがとう

+2

おそらく、いくつかのサンプルデータと期待される結果を提供することができます。また、問題を適切に表示するために必要な最小限のコードを変更することは参考になります。 https://stackoverflow.com/help/how-to-ask –

+0

私の心の読者が修理工場にいるので、見るべきデータの恩恵なしに何を意味するのかを文字通り知ることは不可能 –

+0

申し訳ありません、私は動作するはずのデータ例をいくつか追加しました。私は希望の結果をわずかに収まるように制限しなければならなかった。まだ混乱している場合は、コードを制限します。ご協力ありがとうございました。 – Sab

答えて

1

私はこれを解決するためにケースを使用してこれを解決しました。 例:

case when B.CPNITMREF_0=LAG(B.CPNITMREF_0,1,NULL) over (order by B.BOMSEQ_0, YSTOFCY_0, PIO_0, I.BPSNUM_0) then NULL else B.CPNITMREF_0 end as CPNITMREF 
関連する問題