Ver Mensaje Individual
  #5 (permalink)  
Antiguo 27/01/2009, 05:56
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, 3 meses
Puntos: 2658
Respuesta: empezando con joins

Se comprende.
Básicamente lo que quieres es un reporte que te muestre el resumen (suma total) de cada estado de los campos de todos los pedidos ingresados.
La cosa tiene un par de tips al menos:

1. No te sirve usar INNER JOIN porque INNER JOIN exige que haya una correspondencia 1:1:1 en las tres tablas, eso es, los campos usados de enlace deben estar igualados en las tres tablas, y en el ejemplo que das, en una hay un ID=5 y en otra no.
2. Para que se comprenda por qué no devuelve datos, hay que recordar que toda operación comparativa, aritmética o lógica donde uno de los valores sea NULL devuelve NULL para todo el resultado. Como el cruce de dos tablas devuelve NULL, no importa si cada una de ellas por separado se puede igualar a la tabla primaria pedidos, de todos modos la respuesta es NULL:
3. Para poder administrar el NULL de un JOIN hay que usar LEFT JOIN o RIGHT JOIN, donde la respuesta a la consulta se hace sobre la base de la tabla a la izquierda (LEFT) del JOIN o a la derecha (RIGHT) del mismo.
4. En cualquier caso vas a tener registros donde el valor en los campos sea NULL, lo que trae el problema que si sumas 50 + NULL esto es NULL. En ese caso se soluciona con una función de SQL: IFNULL(). La forma de solucionarlo sería: SUM(IFNULL(campo,0)), y esa sería la operación por cada uno de los campos donde el NULL pueda aparecer.
5. No te olvides que si quieres la sumatoria de campos individuales, esa consulta devuelve siempre un sólo registro, a menos que realices agrupamientos por un campo para ver los subtotales.

Una consulta aproximada sería:
Código sql:
Ver original
  1. SELECT
  2.     tpedidos.Id Id,
  3.     SUM(IFNULL(tpedidos_gen_per.inf03,0)) inf03,
  4.     SUM(IFNULL(tpedidos_gen_per.inf34,0)) inf34,
  5.     SUM(IFNULL(tpedidos_gen_per.inf45,0)) inf45,
  6.     SUM(IFNULL(tpedidos_gen_per.primaria,0)) primaria,
  7.     SUM(IFNULL(tpedidos_gen_per.secundaria,0)) secundaria,
  8.     SUM(IFNULL(tpedidos_gen_per.bachillerato,0)) bachillerato,
  9.     SUM(IFNULL(tpedidos_completos.Cantidad,0)) cantidad_completas
  10. FROM tpedidos
  11.     LEFT JOIN tpedidos_gen_per ON tpedidos.Id = tpedidos_gen_per.Id_pedido
  12.     LEFT JOIN tpedidos_completos  ON tpedidos.Id = tpedidos_completos.Id_pedido
  13.     GROUP BY ID;
Estoy agrupando para hacer una discriminación por ID de pedido. Si lo que se pretende es una síntesis completa, entonces no se puede usar ese campo, porque se suprimiran las variaciones al usar funciones agregadas.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)