none
Eliminar celdas duplicadas en consulta SQL Server RRS feed

  • Pregunta

  • Primero que todo, gracias de antemano y espero me puedan ayudar en la siguiente cuestión:

    Estoy intentando esta consulta:

    Select f.idfactura, f.fecha as fecha_factura, f.comprobante,subtotal-(subtotal*descuento)+(subtotal-(subtotal*descuento)*itbis) as cargo,f.vencimiento , f.moneda,  cxc.referencia, cxc.abono, cxc.fecha, cxc.saldo from Facturas_servicios  f left join cxc on f.idfactura=  cxc.idcxc  where f.cod_cliente =3011  

    La cual me devuelve estos valores:

    idfactura

    fecha_factura

    comprobante

    cargo

    vencimiento

    moneda

    referencia

    abono

    fecha

    saldo

    1

    03-11-16

    A010010010100000044

    529200

    01-01-00

    NULL

    NULL

    NULL

    NULL

    NULL

    2

    03-11-16

    A010010010100000045

    529200

    03-12-16

    NULL

    NULL

    NULL

    03-11-16

    243200

    2

    03-11-16

    A010010010100000045

    529200

    03-12-16

    NULL

    1

    40000

    03-11-16

    NULL

    Pero quisiera una consulta como esta:

    idfactura

    fecha_factura

    comprobante

    cargo

    vencimiento

    moneda

    referencia

    abono

    fecha

    saldo

    1

    03-11-16

    A010010010100000044

    529200

    01-01-00

    NULL

    NULL

    NULL

    NULL

    NULL

    2

    03-11-16

    A010010010100000045

    529200

    03-12-16

    NULL

    NULL

    NULL

    03-11-16

    243200

    NULL

    NULL

    NULL

    NULL

    03-12-16

    NULL

    1

    40000

    03-11-16

    NULL


    En la que no me repite el idfactura, fecha_factura, comprobante ni el cargo


    Gracias nueva vez

    domingo, 6 de noviembre de 2016 4:08

Respuestas

  • Si es un SQL Server moderno (creo que el mínimo requerido es el 2012), puedes usar la función LAG para recuperar el valor del registro anterior, y luego compararlo con el actual y poner NULL en caso de que sean iguales. Más o menos tendrías que hacer algo parecido a lo siguiente en cada uno de los campos que quieres que sean null si coinciden con el anterior:

    NULLIF(idfactura, LAG(idfactura,1,null) over (order by criterio)) as idfactura

    El "criterio" que se pone en el order by del over tiene que ser el mismo que le pongas a la sentencia global. En la sentencia que has indicado en tu pregunta no hay ningún order by, pero debería haberlo porque si no la pregunta no tiene sentido, es decir, no puedes decir "quiere que el campo sea NULL cuando coincida con el anterior" si no se sabe cuál va a ser el "anterior" porque el orden es arbitrario al no tener un order by.

    • Marcado como respuesta Ivan Zormat domingo, 6 de noviembre de 2016 15:43
    domingo, 6 de noviembre de 2016 11:39