none
Left join con filtro de fecha RRS feed

  • Pregunta

  • Buen día  compañeros

    Pido su ayuda para resolver el siguiente problema que tengo con una consulta de SQL, tengo 2 tablas la primera llamada puntos de venta con la siguiente estructura:

    Tabla 1 : Puntos de venta

    codigo_punto_venta

    int

    nombre_punto_venta

    varchar(20)

    ubicacion_fisica

    Varchar(50)

    Dentro de esta tabla existen 4 registros, que corresponden a los 4 puntos de venta que tengo registrados

    1

    Matriz

    Ubicación matriz

    2

    Sucursal A

    Ubicación A

    3

    Sucursal B

    Ubicación B

    4

    Sucursal C

    Ubicación C

    La segunda tabla corresponde a las ventas, la cual tiene la siguiente estructura y contiene el registro de ventas

    Tabla 2 : Registro de ventas

    No_venta

    Int (auto numérico)

    Monto_venta

    Decimal(18,2)

    Fecha_venta

    datetime

    Id_vendedor

    Varchar(20)

    id_punto_venta

    Int

    Utilizo la siguiente consulta para sumar el total de ventas de punto de venta

    SELECT T1.NOMBRE_PUNTO_VENTA, ISNULL(SUM(T2.MONTO_VENTA),0)

    FROM PUNTOS_DE_VENTA AS T1

    LEFT JOIN VENTAS AS T2 ON T2.COD_PUNTO_VENTA=T1.ID_PUNTO_VENTA

    GROUP BY T1.NOMBRE_PUNTO_VENTA

     

    Obtengo el siguiente resultado

     

    Matriz

    3500

    Sucursal A

    4500

    Sucursal B

    2000

    Sucursal C

    1800


    El problema está cuando intento elegir solo un rango de fechas con la misma consulta

    SELECT T1.NOMBRE_PUNTO_VENTA, ISNULL(SUM(T2.MONTO_VENTA),0)

    FROM PUNTOS_DE_VENTA AS T1

    LEFT JOIN VENTAS AS T2 ON T2.COD_PUNTO_VENTA=T1.ID_PUNTO_VENTA

    WHERE T2.FECHA_VENTA BETWEEN ’01-07-2017’ AND ’31-07-2017’

    GROUP BY T1.NOMBRE_PUNTO_VENTA

    Resultado

    Matriz

    1500

    Sucursal B

    100

    Sucursal C

    750

    ¿Como puedo hacer para que en mi segunda consulta siga apareciendo la sucursal A que no tubo ventas en ese rango de fechas?

    Agradezco mucho su ayuda y su tiempo


    martes, 8 de agosto de 2017 19:07

Respuestas

  • Tienes que escribir la expresión como parte de la cláusula ON

    SELECT 
        T1.NOMBRE_PUNTO_VENTA, COALESCE(SUM(T2.MONTO_VENTA),0)
    FROM 
        PUNTOS_DE_VENTA AS T1
        LEFT JOIN VENTAS AS T2 ON T2.COD_PUNTO_VENTA=T1.ID_PUNTO_VENTA
    	   AND T2.FECHA_VENTA BETWEEN '20170701' AND '20170730'
    GROUP BY T1.NOMBRE_PUNTO_VENTA;
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Pepe Chavez martes, 8 de agosto de 2017 20:52
    martes, 8 de agosto de 2017 20:49

Todas las respuestas

  • Hola seria RIGTH JOIN ó FULL OUTER JOIN ya que con LEFT JOIN solo condicionas las uniones de la tabla ubicada al lado izquierdo.

    martes, 8 de agosto de 2017 19:54
  • Gracias por tu respuesta, pero ya intente con INNER, LEFT , RIGHT Y FULL OUTER JOIN y mi resultado es el mismo

    martes, 8 de agosto de 2017 20:27
  • Tienes que escribir la expresión como parte de la cláusula ON

    SELECT 
        T1.NOMBRE_PUNTO_VENTA, COALESCE(SUM(T2.MONTO_VENTA),0)
    FROM 
        PUNTOS_DE_VENTA AS T1
        LEFT JOIN VENTAS AS T2 ON T2.COD_PUNTO_VENTA=T1.ID_PUNTO_VENTA
    	   AND T2.FECHA_VENTA BETWEEN '20170701' AND '20170730'
    GROUP BY T1.NOMBRE_PUNTO_VENTA;
    GO


    Nuestra profesión exige tener pasión por resolver problemas de una manera óptima y eficiente.
    • Marcado como respuesta Pepe Chavez martes, 8 de agosto de 2017 20:52
    martes, 8 de agosto de 2017 20:49
  • Muchas gracias Willams Morales, me fue muy útil tu respuesta
    • Editado Pepe Chavez martes, 8 de agosto de 2017 20:59
    martes, 8 de agosto de 2017 20:54