Ver Mensaje Individual
  #4 (permalink)  
Antiguo 26/04/2010, 21:40
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: 17 años
Puntos: 2658
Respuesta: Unir tablas en un renglon

Aún no queda claro qué tipo de columna usas para guardar la fecha, y eso es importante a la hora de realizar conversiones.

Ahora bien, analizando tu sentencia:
Código MySQL:
Ver original
  1.   SUM(R.importetotal) total,
  2.   R.importetotal,
  3.   CONCAT(COUNT(res.codres),'/2') cantidad,
  4.   COUNT(A.codachura) cantidadachuras,
  5.   SUM(A.importeventaachura) totalachuras,
  6.   CAST(GROUP_CONCAT(CONCAT(R.codres,'-', R.peso) separator '/') AS CHAR(100)) renglon,
  7.   C.nombre
  8. FROM res R
  9.   INNER JOIN clientes C ON C.codcliente = R.codcliente
  10.   INNER JOIN achuras A ON A.codcliente = C.codcliente
  11.   R.fecha_salida = '20100426'
  12.   AND
  13.   A.fecha_salida = '20100426'
  14. GROUP BY C.codcliente
Esto, para devolver registros, tiene que cumplir dos condiciones:
1. La fecha de salida de res y de achuras debe ser sí o si 26/04/2010.
2. De haber por lo menos un registro de res cuyo codcliente esté al mismo tiempo en otro registro de ese día de achuras, y también que sea un cliente válido.

El tema aquí es que ambos grupos de condiciones deben cumplirse al mismo tiempo para que haya registros devueltos. Es decir: Sólo devolverá registros si al mismo tiempo hay salidas de res y de achuras... Si hay de uno sólo, no lo devolverá.
El otro problema de lógica se da porque el orden de las tablas hace que sólo se considere un registro para el caso de que haya res en salida. Si no la hay, el análisis jamás llegará al de achuras. Esto se debe a que el orden de lectura de las tablas es de izquierda a derecha.

Un esquema más flexible sería:
Código MySQL:
Ver original
  1.   SUM(R.importetotal) total,
  2.   R.importetotal,
  3.   CONCAT(COUNT(res.codres),'/2') cantidad,
  4.   COUNT(A.codachura) cantidadachuras,
  5.   SUM(A.importeventaachura) totalachuras,
  6.   CAST(GROUP_CONCAT(CONCAT(R.codres,'-', R.peso) separator '/') AS CHAR(100)) renglon,
  7.   C.nombre
  8. FROM clientes C
  9.   LEFT JOIN res R ON C.codcliente = R.codcliente
  10.   LEFT JOIN achuras A ON C.codcliente = A.codcliente
  11.   R.fecha_salida = '20100426'
  12.   AND
  13.   A.fecha_salida = '20100426'
  14. GROUP BY C.codcliente

En ese caso lo más importante son los clientes, que siempre existen, mientras que sumará los valores de una u otra tabla si y sólo si hay valores relacionados con el cliente para hacerlo.

Un punto aparte es este segmento:
Código MySQL:
Ver original
  1. CAST(GROUP_CONCAT(CONCAT(R.codres,'-', R.peso) separator '/') AS CHAR(100)) renglon,
Esto parece correcto, pero puede dar lugar a errores por truncado de datos, si el grupo acumulado excede los 100 caracteres, o por compatibilidad de datos devueltos, ya que en determinado contexto puede estar devolviendo un BLOB y no un CHAR (realiza una conversión implícita por las características del dato devuelto).
En definitiva, hay que verificar el resultado de este campo.

Espero que te sea útil.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)