SQL - 如何使用null替换某些重复值

时间:2017-11-02 14:31:18

标签: sql sql-server null duplicates lag

当ITMBPS详细信息重复值时,我试图从两个部分中清空BOMSEQ_0,CPNITMREF_0,YREF_0和TEXTE_0的值。

    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

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分: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