Ver Mensaje Individual
  #2 (permalink)  
Antiguo 12/02/2013, 19:01
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Mi consulta agrupa mal los datos

Hay varias consideraciones. Lo primero es que si agrupas la suma de las facturas de un cliente, no tienen ningún sentido que quieras poner los datos de la factura en la consulta, porque esos datos no son relevantes para la consulta, y por la forma que agrupa MySQL pueden darte datos erróneos.
No te olvides que un GROUP BY es una consolidación de datos, donde los datos que no participan del cálculo, generan ruido, datos "sucios".
Por otro lado, no es buena idea usar CASE, mas que en contadas ocasiones. CASE es un vicio de programadores, pero aunque el SQL lo admite, termina generando consultas ineficientes, en especial cuando sólo quieres comparar un único valor por TRUE o FALSE. En esos casos es más simple usar IF():
Código MySQL:
Ver original
  1.     c.cliente,
  2.     f.folio,
  3.     f.fecha,
  4.     f.subtotaFactura,
  5.     f.ivaFactura,
  6.     f.totalFactura,
  7.     a.nombreAsociado,
  8.     f.status,
  9.     SUM(IF(MONTH(f.fecha) = 1, totalFactura, 0)) Enero,
  10.     SUM(IF(MONTH(f.fecha) = 2, totalFactura, 0)) Febrero,
  11.     SUM(IF(MONTH(f.fecha) = 3, totalFactura, 0)) Marzo,
  12.     SUM(IF(MONTH(f.fecha) = 4, totalFactura, 0)) Abril,
  13.     SUM(IF(MONTH(f.fecha) = 5, totalFactura, 0)) Mayo,
  14.     SUM(IF(MONTH(f.fecha) = 6, totalFactura, 0)) Junio,
  15.     SUM(IF(MONTH(f.fecha) = 7, totalFactura, 0)) Julio,
  16.     SUM(IF(MONTH(f.fecha) = 8, totalFactura, 0)) Agosto,
  17.     SUM(IF(MONTH(f.fecha) = 9, totalFactura, 0)) Septiembre,
  18.     SUM(IF(MONTH(f.fecha) = 10, totalFactura, 0)) Octubre,
  19.     SUM(IF(MONTH(f.fecha) = 11, totalFactura, 0)) Noviembre,
  20.     SUM(IF(MONTH(f.fecha) = 12, totalFactura, 0)) Diciembre,
  21.     SUM( f.totalFactura) totalgral
  22. FROM factura f
  23.     JOIN  cliente c ON f.clienteID = c.clienteID
  24.     JOIN asociado a ON c.asociadoID=a.asociadoID
  25. WHERE ...
Otras cosas:
- AS está obsoleto, y no se requiere. Sólo existe por compatibilidad muy vieja y en los manuales de desarrollo de las empresas de software se suele recomendar no usarlo. No aporta nada y genera código confuso a simple vista.
- Cuidado con las palabras reservadas (como STATUS) en los nombres de campos, tablas o bases. Tienden a generar errores de sintaxis indetectables.

Finalmente, sobre tu última pregunta:
Cita:
Agrupa las dos y les da un solo status como puedo modificar esto
El GROUP BY está mal definido para lograr eso. En tanto estés agrupando sólo por cliente y no por factura al mismo tiempo, el resultado no es técnicamente incorrecto. Pero no cumple lo que quieres porque lo que le dices a MySQL no es eso.
Al menos debería incluir la factura, o bien otro de los datos:
Código MySQL:
Ver original
  1.     c.cliente,
  2.     f.folio,
  3.     f.fecha,
  4.     f.subtotaFactura,
  5.     f.ivaFactura,
  6.     f.totalFactura,
  7.     a.nombreAsociado,
  8.     f.status,
  9.     SUM(IF(MONTH(f.fecha) = 1, totalFactura, 0)) Enero,
  10.     SUM(IF(MONTH(f.fecha) = 2, totalFactura, 0)) Febrero,
  11.     SUM(IF(MONTH(f.fecha) = 3, totalFactura, 0)) Marzo,
  12.     SUM(IF(MONTH(f.fecha) = 4, totalFactura, 0)) Abril,
  13.     SUM(IF(MONTH(f.fecha) = 5, totalFactura, 0)) Mayo,
  14.     SUM(IF(MONTH(f.fecha) = 6, totalFactura, 0)) Junio,
  15.     SUM(IF(MONTH(f.fecha) = 7, totalFactura, 0)) Julio,
  16.     SUM(IF(MONTH(f.fecha) = 8, totalFactura, 0)) Agosto,
  17.     SUM(IF(MONTH(f.fecha) = 9, totalFactura, 0)) Septiembre,
  18.     SUM(IF(MONTH(f.fecha) = 10, totalFactura, 0)) Octubre,
  19.     SUM(IF(MONTH(f.fecha) = 11, totalFactura, 0)) Noviembre,
  20.     SUM(IF(MONTH(f.fecha) = 12, totalFactura, 0)) Diciembre,
  21.     SUM( f.totalFactura) totalgral
  22. FROM factura f
  23.     JOIN  cliente c ON f.clienteID = c.clienteID
  24.     JOIN asociado a ON c.asociadoID=a.asociadoID
  25. WHERE ...
  26. GROUP BY c.clienteID , f.nroFactura WITH ROLLUP

Por supuesto que sin ver una muestra real de datos, no te puedo decir si esto dará el resultado que necesitas. Para eso deberíamos ver la estructura de las tablas y la muestra de datos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)