1

Mi duda es simple, tengo una tabla de ventas y otra con los tipos de ventas (crédito, contado, instituciones_asociadas) que están relacionadas entre si, y necesito realizar un informe en donde obtener el total vendido por estas categorías, ejemplo: hoy vendí 100 mil contado, 300 mil en crédito.

esto lo logro con un:

SELECT TIP_VTA,SUM(TOT_VTA)
FROM VENTAS,TIPVTA 
WHERE VENTAS.TIP_VTA=TIPVTA.COD_VTA 
AND FEC_VTA = '2020-02-05' 
GROUP BY TIP_VTA;

En el informe deben aparecer todas las categorías y esta consulta solo me las muestra todas si en la fecha que indique efectivamente se ocuparon estos tipos de venta.

Como podría realizar una consulta donde aparezcan todas las categorías independiente si se utilizaron o no en una fecha especifica. Lo que necesito es que si en la fecha indicada en la consulta no existen ventas crédito, por decir algo, esta aparezca pero con la sumatoria en 0. De antemano muchas gracias.

BetaM
  • 30,571
  • 7
  • 32
  • 50

2 Answers2

2

Entiendo que puedes lograr esto utilizando un Join en tu consulta:

SELECT TIP_VTA,SUM(TOT_VTA)
FROM VENTAS
RIGHT JOIN TIPVTA 
ON VENTAS.TIP_VTA=TIPVTA.COD_VTA AND FEC_VTA = '2020-02-05' 
GROUP BY TIP_VTA;

De esta forma te aseguras de tener las filas de la tabla TIPVTA.

También puedes usar un LEFT JOIN que haría una lectura mas limpia de la consulta:

SELECT TIP_VTA,SUM(TOT_VTA)
FROM TIPVTA
LEFT JOIN VENTAS
ON VENTAS.TIP_VTA=TIPVTA.COD_VTA AND FEC_VTA = '2020-02-05' 
GROUP BY TIP_VTA;

El LEFT JOIN te permite mostrar todos los registros de la tabla a la izquierda, en este caso TIPVTA y juntarlos con la otra tabla, quedando los valores que no tienen registros vinculados en null o en 0. Con el RIGHT JOIN ocurre lo mismo de forma análoga.

  • 1
    Muchas Gracias amigo, es lo que buscaba. Saludos – Benjamin Garrido H. Feb 06 '20 at 14:09
  • Mejor un left.. con right, pareceria (a simple vista) que seguis sin traer todas las categorias (porque tip_vta esta del lado de ventas). De paso, considera agregar una explicacion a tu respuesta. – gbianchi Feb 06 '20 at 14:09
  • De nada Benjamin. Saludos. gbianchi: puse un Right Join porque las tablas las había escrito así, pero es verdad, queda mas intuitivo utilizar un Left Join. Ahora actualizo la respuesta. Saludos. – Fernando Madriaga Feb 06 '20 at 14:14
0

Puedes utilizar el OR en la condición de la fecha para que obtengas el resultado que esperas.

SELECT TIP_VTA,SUM(TOT_VTA) FROM VENTAS,TIPVTA WHERE VENTAS.TIP_VTA=TIPVTA.COD_VTA AND (FEC_VTA = '2020-02-05' OR FEC_VTA IS NULL OR FEC_VTA <> '2020-02-05') GROUP BY TIP_VTA;
Bicho
  • 1,653
  • 4
  • 7
  • 15