SQL去除重复

查询代码:

select 
 PTD.PTHNUM_0,
case when GE.SNS_0 = -1 then -ABS(AMTCUR_0) else AMTCUR_0 end VARI,
PD.POHNUM_0,
PE.ACCDAT_0 A,
PD.NUM_0,
  PD.TSICOD_0,
  IR.ITMREF_0,
  D.TEXTE_0,
  AA.TEXTE_0,
  PTD.NETCUR_0,
 
  PD.LINCSTPUR_0,
 PTD.LINCSTPUR_0,
  PD.QTYSTU_0,
  PTD.QTYSTU_0
from GACCENTRYD GE 
left join GACCENTRY GY on GE.NUM_0 = GY.NUM_0
left join PRECEIPTD PTD on GY.BPRVCR_0 = PTD.PTHNUM_0
left join PINVOICED PD on PTD.PTHNUM_0 = PD.PTHNUM_0
LEFT JOIN PINVOICE PE ON PE.NUM_0=PD.NUM_0
 LEFT JOIN PORDER PR ON PR.POHNUM_0=PTD.POHNUM_0 
         LEFT JOIN PORDERP PP ON PP.POHNUM_0=PTD.POHNUM_0 AND PTD.PTDLIN_0=PP.POPLIN_0 
         LEFT JOIN PORDERQ PQ ON PQ.POHNUM_0=PP.POHNUM_0 AND PQ.POPLIN_0=PP.POPLIN_0 AND PP.POPSEQ_0=PQ.POQSEQ_0
                  LEFT JOIN ITMMASTER IR ON IR.ITMREF_0=PD.ITMREF_0
                  LEFT JOIN ATEXTRA D ON IR.ITMREF_0=D.IDENT1_0 AND D.CODFIC_0='ITMMASTER' AND D.ZONE_0='DES1AXX'AND D.LANGUE_0='ENG'
      LEFT JOIN ATEXTRA AA ON IR.ITMREF_0=AA.IDENT1_0 AND AA.CODFIC_0='ITMMASTER' AND AA.ZONE_0='DES1AXX'AND AA.LANGUE_0='CHI'


where 
GE.ACC_0 = '13012000'  and PD.FCY_0='CH01' AND PD.PIVTYP_0<>'CNICC' AND PTD.CPY_0='SFL'

        ORDER BY PD.NUM_0


输出后如下图:




问题:红框中数据如何只显示一条?

distinct

select
 distinct
 PTD.PTHNUM_0,
case when GE.SNS_0 = -1 then -ABS(AMTCUR_0) else AMTCUR_0 end VARI,
PD.POHNUM_0,
PE.ACCDAT_0 A,
PD.NUM_0,
  PD.TSICOD_0,
  IR.ITMREF_0,
  D.TEXTE_0,
  AA.TEXTE_0,
  PTD.NETCUR_0,
 
  PD.LINCSTPUR_0,
 PTD.LINCSTPUR_0,
  PD.QTYSTU_0,
  PTD.QTYSTU_0
from GACCENTRYD GE 
left join GACCENTRY GY on GE.NUM_0 = GY.NUM_0
left join PRECEIPTD PTD on GY.BPRVCR_0 = PTD.PTHNUM_0
left join PINVOICED PD on PTD.PTHNUM_0 = PD.PTHNUM_0
LEFT JOIN PINVOICE PE ON PE.NUM_0=PD.NUM_0
 LEFT JOIN PORDER PR ON PR.POHNUM_0=PTD.POHNUM_0 
         LEFT JOIN PORDERP PP ON PP.POHNUM_0=PTD.POHNUM_0 AND PTD.PTDLIN_0=PP.POPLIN_0 
         LEFT JOIN PORDERQ PQ ON PQ.POHNUM_0=PP.POHNUM_0 AND PQ.POPLIN_0=PP.POPLIN_0 AND PP.POPSEQ_0=PQ.POQSEQ_0
                  LEFT JOIN ITMMASTER IR ON IR.ITMREF_0=PD.ITMREF_0
                  LEFT JOIN ATEXTRA D ON IR.ITMREF_0=D.IDENT1_0 AND D.CODFIC_0='ITMMASTER' AND D.ZONE_0='DES1AXX'AND D.LANGUE_0='ENG'
      LEFT JOIN ATEXTRA AA ON IR.ITMREF_0=AA.IDENT1_0 AND AA.CODFIC_0='ITMMASTER' AND AA.ZONE_0='DES1AXX'AND AA.LANGUE_0='CHI'


where 
GE.ACC_0 = '13012000'  and PD.FCY_0='CH01' AND PD.PIVTYP_0<>'CNICC' AND PTD.CPY_0='SFL'

        ORDER BY PD.NUM_0

试过了,红框中的4条依旧存在

第一栏是什么数据

361,362。。。

我看你后面还有字段没显示出来。

distinct是针对所有字段值相同才有效,不是部分字段值相同



并不是所有值都相同的

所有说,去不了

只能从sql上解决

倒数第三列,有用吗。没有用的话,去掉,再用distinct就可以

红色圈中的数据重复的原因,是因为关联的表中错误一对多的关系

存在

可否给个条件,如果362.363,364行等于他们的值时,VARI显示0?



等于红框中内容时,VARI显示为0?

判断是要拿查询的列进行判断的。

那几个数字是列吗,

是的

那列?

case when GE.SNS_0 = -1 then -ABS(AMTCUR_0) else AMTCUR_0 end VARI,

你指的是哪几个数字

红框中的嘛

361,362,,

  PD.LINCSTPUR_0,

 PTD.LINCSTPUR_0,


类似于IF ,如果 (PD.LINCSTPUR_0 = '25486.2000000000000' and PTD.LINCSTPUR_0, = '573439.500000000')  那么VARI = 0

那你用if满足不了?

你是没明白你要的是什么啊,只是单纯的觉得他们重复了就想排除,你这样是问不到想要结果的,只有你弄明白了才能问到结果。

比如【如果 (PD.LINCSTPUR_0 = '25486.2000000000000' and PTD.LINCSTPUR_0, = '573439.500000000')  那么VARI = 0】

你是对361 362 这两行的是25486,573439这两个值是0,但是你其他行不一定是这两个值,你得有个通用的判断列,比如有两行371 372,这两个值 是1 和2,那你这个if是完全没有办法判断的

加我q吧,我帮你优化sql

1571488201