Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Mi consulta agrupa mal los datos

Estas en el tema de Mi consulta agrupa mal los datos en el foro de Mysql en Foros del Web. Buenas foro Tengo una consulta que de principio estaba muy bien pero ahora que le pongo where y una condicion me agrupa mal. esta consulta ...
  #1 (permalink)  
Antiguo 12/02/2013, 16:33
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Pregunta Mi consulta agrupa mal los datos

Buenas foro

Tengo una consulta que de principio estaba muy bien pero ahora que le pongo where y una condicion me agrupa mal.

esta consulta maneja status pero no siempre es el mismo puede ser un cliente con venta cancelada, pagada o pendiente por pago pero me los agrupa en uno solo:

En vez de poner
Pagada cliente1
Cancelada cliente1

Agrupa las dos y les da un solo status como puedo modificar esto:

Código MySQL:
Ver original
  1. SELECT c.cliente,f.folio,f.fecha,f.subtotaFactura,f.ivaFactura,f.totalFactura,a.nombreAsociado,f.status,
  2. SUM(CASE WHEN MONTH( f.fecha ) = 1 THEN totalFactura ELSE 0 END) AS Enero,
  3. SUM(CASE WHEN MONTH( f.fecha ) = 2 THEN totalFactura ELSE 0 END) AS Febrero,
  4. SUM(CASE WHEN MONTH( f.fecha ) = 3 THEN totalFactura ELSE 0 END) AS Marzo,
  5. SUM(CASE WHEN MONTH( f.fecha ) = 4 THEN totalFactura ELSE 0 END) AS Abril,
  6. SUM(CASE WHEN MONTH( f.fecha ) = 5 THEN totalFactura ELSE 0 END) AS Mayo,
  7. SUM(CASE WHEN MONTH( f.fecha ) = 6 THEN totalFactura ELSE 0 END) AS Junio,
  8. SUM(CASE WHEN MONTH( f.fecha ) = 7 THEN totalFactura ELSE 0 END) AS Julio,
  9. SUM(CASE WHEN MONTH( f.fecha ) = 8 THEN totalFactura ELSE 0 END) AS Agosto,
  10. SUM(CASE WHEN MONTH( f.fecha ) = 9 THEN totalFactura ELSE 0 END) AS Septiembre,
  11. SUM(CASE WHEN MONTH( f.fecha ) = 10 THEN totalFactura ELSE 0 END) AS Octubre,
  12. SUM(CASE WHEN MONTH( f.fecha ) = 11 THEN totalFactura ELSE 0 END) AS Noviembre,
  13. SUM(CASE WHEN MONTH( f.fecha ) = 12 THEN totalFactura ELSE 0 END) AS Diciembre,
  14. SUM( f.totalFactura ) AS totalgral
  15. FROM factura AS f JOIN  cliente AS c ON f.clienteID = c.clienteID JOIN asociado AS a ON c.asociadoID=a.asociadoID ".$where." GROUP BY c.cliente WITH ROLLUP
__________________
Lo imposible solo cuesta un poco mas
  #2 (permalink)  
Antiguo 12/02/2013, 19:01
Avatar de 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, 4 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)
  #3 (permalink)  
Antiguo 13/02/2013, 09:29
Avatar de jandrogdz  
Fecha de Ingreso: julio-2012
Ubicación: public $Guadalajara
Mensajes: 397
Antigüedad: 11 años, 9 meses
Puntos: 12
Respuesta: Mi consulta agrupa mal los datos

Gracias por contestar.

Asi como tu me dices lo que hace es separar todas las facturas, de esta forma ya no esta agrupando en un solo cliente todas sus ventas.

Lo que necesito hacer y aun no he podido es que sume solo las que estan en status pagada y las de cancelada no las sume pero no sigo sin tener idea de como hacerlo.

Cliente 1 tiene 5 facturas de las cuales solo 2 son pagadas 2 son canceladas y 1 esta en pendiente como hago para sumar solo las pagadas pero tambien mostrar las canceladas y las pendientes
__________________
Lo imposible solo cuesta un poco mas

Etiquetas: join, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:51.