none
Resultados Duplicados al hacer Left Join RRS feed

  • Pregunta

  • Buenas tardes,

    Tengo un procedimiento almacenado enjutándose hace más de un año , por alguna razón en un día especifico   me retorna resultados duplicados.   Tengo la tabla  @Ventas  y @devolucion  al unirlas se produce el duplicado solo en el día 19 de oct,  el resto de días, meses atrás y días posterior el mismo script funciona correctamente.

    INSERT INTO @FINAL
    SELECT  VENTA.FECHADEVENTA
    ,VENTA.DESCRIPCION
    ,VENTA.USUARIO
    ,SUM (VENTA.EFECTIVO ) AS EFECTIVO
    ,SUM (VENTA.TARJETA) AS TARJETA
    ,CASE WHEN DEVO.IDUSER = VENTA.IDUSUARIO AND VENTA.DESCRIPCION = 'Efectivo' THEN DEVO.IMPORTE ELSE 0 END AS DEVOLUCIONES 

    FROM @VENTA  AS VENTA   LEFT JOIN @DEVOLUCION AS DEVO ON  VENTA.FECHADEVENTA = DEVO.FECHADEVENTA 
    GROUP BY VENTA.USUARIO, VENTA.FECHADEVENTA , VENTA.DESCRIPCION, DEVO.IMPORTE, DEVO.IDUSER, VENTA.IDUSUARIO
    ORDER BY VENTA.FECHADEVENTA

    RESULTADO 

    FECHADEVENTA                DESCRIPCION       USUARIO                EFECTIVO TARJETA DEVOLUCIONES
    2020-10-16 00:00:00.000 Efectivo                      24                    7560.00 0.00      24.00
    2020-10-16 00:00:00.000 Tarjeta de Crédito            24                    0.00    3105.00 0.00
    2020-10-17 00:00:00.000 Efectivo                      24                    2767.00   0.00 0.00
    2020-10-17 00:00:00.000 Tarjeta de Crédito            24                    0.00            216.00 0.00
    2020-10-17 00:00:00.000 Efectivo                      37                 2423.00              0.00  0.00
    2020-10-17 00:00:00.000 Tarjeta de Crédito            37                 0.00            559.00 0.00
    2020-10-18 00:00:00.000 Efectivo                      24                    2364.00       0.00    0.00
    2020-10-18 00:00:00.000 Tarjeta de Crédito            24                    0.00               60.00 0.00
    2020-10-18 00:00:00.000 Efectivo                      37                 3076.00        0.00 0.00
    2020-10-18 00:00:00.000 Tarjeta de Crédito            37                 0.00            142.00 0.00
    2020-10-19 00:00:00.000 Efectivo                      24                    2690.00          0.00 156.00
    2020-10-19 00:00:00.000 Efectivo                      24                    2690.00      0.00 0.00
    2020-10-19 00:00:00.000 Tarjeta de Crédito            24                    0.00         1045.00 0.00
    2020-10-19 00:00:00.000 Tarjeta de Crédito            24                    0.00         1045.00 0.00
    2020-10-19 00:00:00.000 Efectivo                      37                 1678.00      0.00 0.00
    2020-10-19 00:00:00.000 Efectivo                      37                 1678.00      0.00 191.00
    2020-10-19 00:00:00.000 Tarjeta de Crédito            37                      0.00 3158.00 0.00
    2020-10-19 00:00:00.000 Tarjeta de Crédito            37                      0.00 3158.00 0.00
    2020-10-20 00:00:00.000 Efectivo                      24                    6050.00       0.00 0.00
    2020-10-20 00:00:00.000 Tarjeta de Crédito            24                    0.00          3268.00 0.00
    2020-10-20 00:00:00.000 Efectivo                      37                 1128.00       0.00 0.00


    TABLA @DEVOLUCION

    FECHADEVENTA                    IDUSER IMPORTE
    2020-10-16 00:00:00.000    24           24.00
    2020-10-19 00:00:00.000    24          156.00
    2020-10-19 00:00:00.000    37          191.00

    Si elimino el inner join a la tabla devoluciones  funciona correctamente, el punto es que solo en ese día en especifico genera el doble resultado.

    Alguna idea? O como puedo  cambiar el script ¿?

    jueves, 29 de octubre de 2020 21:08

Respuestas

  • Hola Pedroest84:

    Puedes utilizar el operador apply

    Select venta.fechadeventa
    	 , venta.descripcion
    	 , venta.usuario
    	 , Sum(venta.efectivo) As efectivo
    	 , Sum(venta.tarjeta) As tarjeta
    	 , Case
    		   When devo.iduser = venta.idusuario And venta.descripcion = 'Efectivo' Then devo.importe
    	   Else 0
    	   End As devoluciones
    	   From @Venta As venta
    			Outer apply (
    			Select sum(importe) as importe, iduser
    			from
    			@Devolucion As devo
    			where  venta.fechadeventa = devo.fechadeventa
    			and venta.idusuario = devo.iduser 
    			group by iduser
    			
    			) devo
    	   Group By venta.usuario
    			  , venta.fechadeventa
    			  , venta.descripcion
    			  , devo.importe
    			  , devo.iduser
    			  , venta.idusuario
    Order By venta.fechadeventa;

    Te he añadido en el conjunto interior and venta.idUsuario = devo.idUser, dado que supongo que las devoluciones además de por la fecha, se referenciarán al usuario.

    Apply

    https://javifer2.wordpress.com/2020/06/27/operador-apply/

    • Marcado como respuesta Pedroest84 viernes, 30 de octubre de 2020 17:11
    viernes, 30 de octubre de 2020 1:16

Todas las respuestas

  • Hola Pedroest84:

    Puedes utilizar el operador apply

    Select venta.fechadeventa
    	 , venta.descripcion
    	 , venta.usuario
    	 , Sum(venta.efectivo) As efectivo
    	 , Sum(venta.tarjeta) As tarjeta
    	 , Case
    		   When devo.iduser = venta.idusuario And venta.descripcion = 'Efectivo' Then devo.importe
    	   Else 0
    	   End As devoluciones
    	   From @Venta As venta
    			Outer apply (
    			Select sum(importe) as importe, iduser
    			from
    			@Devolucion As devo
    			where  venta.fechadeventa = devo.fechadeventa
    			and venta.idusuario = devo.iduser 
    			group by iduser
    			
    			) devo
    	   Group By venta.usuario
    			  , venta.fechadeventa
    			  , venta.descripcion
    			  , devo.importe
    			  , devo.iduser
    			  , venta.idusuario
    Order By venta.fechadeventa;

    Te he añadido en el conjunto interior and venta.idUsuario = devo.idUser, dado que supongo que las devoluciones además de por la fecha, se referenciarán al usuario.

    Apply

    https://javifer2.wordpress.com/2020/06/27/operador-apply/

    • Marcado como respuesta Pedroest84 viernes, 30 de octubre de 2020 17:11
    viernes, 30 de octubre de 2020 1:16
  • Hola Javi, Funciona perfecto Gracias.

    Aun estoy perdido con el operador apply, pero lo estaré revisando a fondo.  Muchas gracias por el ejemplo,  ya tenia varias tardes buscando una solución.

    pd.

    Veo que tienes bastante información en tu sitio. ya tiene un nuevo lector.

    Pedro ER

    viernes, 30 de octubre de 2020 17:22