Ver Mensaje Individual
  #1 (permalink)  
Antiguo 19/11/2014, 05:58
guilens2
 
Fecha de Ingreso: noviembre-2014
Mensajes: 4
Antigüedad: 9 años, 5 meses
Puntos: 0
Restar dos Count MySQL

Buenos días, he estado intentando hacer una consulta mysql durante varias horas pero no hay manera, a ver si pueden ayudarme por favor.

Tengo la tabla Facturas, la tabla Abonos y la Tabla Clientes.

La Relación de Facturas y Abonos se hace gracias al id del Cliente.

Necesito conseguir el resultado de restar el total de Facturas realizadas - el Total de Abonos realizados por los clientes.

Consigo hacerlo de forma individual, es decir, para un cliente en concreto, con la siguiente consulta
Código MySQL:
Ver original
  1. SELECT (SELECT COUNT(distinct factura_numero) FROM Facturas
  2.  INNER JOIN Ventas ON ventas_id = factura_ventas_id
  3.  INNER JOIN Clientes ON cliente_id=ventas_id_cliente
  4. # ----------------------------------------------
  5. WHERE cliente_id=121) -
  6. # ----------------------------------------------
  7. (SELECT COUNT(abonos_id) FROM Abonos
  8.  INNER JOIN Clientes ON cliente_id=abonos_id_cliente
  9. # ----------------------------------------------
  10. WHERE cliente_id=121
  11. # ----------------------------------------------
  12. ) AS RestaCount
Con esto consigo restar 23 facturas - 6 abonos para id 121 = 17. Hasta aquí correcto.

Lo ideal sería conseguirlo para todos los clientes, algo así como un group by clientes_id y obtener:
id 121, total 23
id 122, total 12
.....

Imagino que estoy haciendo algo mal, porque algunos clientes No han hecho abonos e incluso algunos clientes No han llegado a facturar todavía, entonces tal vez haya que meter un Left Join en algún sitio, pero no se donde.

Si introduzco un group by haciendo algo así:

Código MySQL:
Ver original
  1. SELECT t1.Total - t2.Total FROM(
  2. SELECT cliente_id, COUNT( DISTINCT factura_numero ) as Total
  3. FROM Facturas
  4. INNER JOIN Ventas ON ventas_id = factura_ventas_id
  5. INNER JOIN Clientes ON cliente_id = ventas_id_cliente
  6. GROUP BY cliente_id) as t1, (SELECT cliente_id, COUNT(abonos_id) as Total
  7.         FROM Abonos
  8.        INNER JOIN Clientes ON cliente_id=abonos_id_cliente group by cliente_id) as t2 WHERE t1.cliente_id=t2.cliente_id
Sencillamente se vuelve loco,

Un saludo y gracias

Última edición por gnzsoloyo; 20/11/2014 a las 06:37 Razón: Legibilidad de codigo SQL