SQL - INNER JOIN multiplica resultados

 
Vista:
sin imagen de perfil

INNER JOIN multiplica resultados

Publicado por Nicolas (3 intervenciones) el 26/11/2014 02:44:46
Hola, que tal. Es mi primera vez en un foro como estos, vi algunas soluciones a mi problema pero no estoy dando en la tecla con la real solucion a mi problema.

Lo que necesito es que agrupando por fecha, obtenga la cantidad de kilos que envie.

Código SQL:
SELECT DISTINCT
COUNT(PM.numero) AS cantNumero,
TE.fecha AS fecha,
(SUM(DE.peso_unitario) * SUM(AP.cantidad)) AS SumaTotal

FROM pedido_modelo PM
INNER JOIN turno_entrega TE ON PM.turno_entrega_id=TE.id
INNER JOIN alimento_pedido AP ON PM.numero=AP.pedido_numero
INNER JOIN detalle_alimento DE ON AP.detalle_alimento_id=DE.id_detallealimento
GROUP BY fecha


Hice una prueba en papel con los resultados que tendria que darme la consulta, pero descubri que me multiplica resultados, es decir, tengo un problema con esta parte en especial:
INNER JOIN alimento_pedido AP ON PM.numero=AP.pedido_numero

En donde yo, por cada pedido (de la tabla 'pedido_modelo') puedo tener varios alimentos (de la tabla 'alimento_pedido').

Para orientar un poco, cuando hago "COUNT(PM.numero)" me tendria que devolver la cantidad de pedidos que tuve en x fecha, sin embargo me devuelve la multiplicacion del numero de pedidos por el numero de alimentos que encargue en esa fecha.

Por ejemplo, pongo fecha primero y pedidos del dia despues.
01/01/2014
-Tengo 3 pedidos, con 2 alimentos encargados c/u, COUNT(PM.numero) me devuelve 6 cuando deberia devolverme 3.
02/02/2014
-Tengo 1 pedido, con 3 alimentos encargados, COUNT(PM.numero) me devuelve 3 cuando deberia devolverme 1.

Desde ya muchas gracias, agradeceria una pronta respuesta.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 17
Ha aumentado su posición en 4 puestos en SQL (en relación al último mes)
Gráfica de SQL

INNER JOIN multiplica resultados

Publicado por Juan (16 intervenciones) el 26/11/2014 16:03:17
Buenas Nicolas

Así a bote pronto no sé que te puede estar fallando. Yo probaría a hacer las consultas de INNER JOIN en INNER JOIN, por ejemplo:

SELECT DISTINCT
COUNT(PM.numero) AS cantNumero,
TE.fecha AS fecha

FROM pedido_modelo PM
INNER JOIN turno_entrega TE ON PM.turno_entrega_id=TE.id
group by FECHA

Una vez que esté resultado te cuadra con tus cálculos pasas al siguiente (no descartes el uso de cursores si es posible). En cualquier caso, es muy probable que necesites para lo que buscas tener que usar en algún momento más que INNER JOIN, RIGH o LEFT JOIN.

Prueba así y cuenta lo que va pasando, quizás con eso puedas ir arreglando algo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

INNER JOIN multiplica resultados

Publicado por Nicolas (3 intervenciones) el 26/11/2014 16:16:55
Es lo que hice antes de consultar por aca, justamente por eso dije que tenia problemas con esta parte en especial
INNER JOIN alimento_pedido AP ON PM.numero=AP.pedido_numero
Y vuelvo a aclarar para dar mas datos, yo por cada tupla de la tabla "pedido_modelo PM" (en donde la pk es el campo 'numero') puedo tener varios elementos relacionados en la tabla "alimento_pedido".
Es decir, en la tabla alimento_pedido (que no tiene pk) hay 3 elementos relacionados a 1 solo elemento de la tabla pedido_modelo, y ahi es donde me multiplica los resultados, cuando hago count(PM.numero) en vez de devolverme el numero de pedidos para una fecha, me devuelve el numero de pedidos multiplicado por el numero de veces que esta ese id "numero" en la tabla alimento_pedido.
Resumiendo, me hace lo siguiente:
Cuando hago COUNT(PM.numero)
me realiza:
COUNT(PM.numero) * COUNT(AP.pedido_numero)

Voy probando las consultas en PhpMyAdmin y viendo que me devuelven las tablas, y ocurre -en efecto- lo que dije en mi hilo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 109
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

INNER JOIN multiplica resultados

Publicado por Rafael (111 intervenciones) el 26/11/2014 16:50:55
Por lo que dices en resumen cuenta mas de una vez el campo
PM.numero

Ahora bien no entiendo para que pones el DISTINCT si ya estas agrupando por fecha ...

Y por ultimo es mas rapido que resuelva la multiplicacion de cada alimento y despues sume y no que sume cantidades y peso_unitario ... lo cual tampoco es muy correcto ...

Vaya como prueba de escritorio
Tu metodo
Producto 1 peso 0.3 cantidad 3
Producto 2 peso 0.25 cantidad 2
Peso Total .55 cantidad total 5 = 2,75 SumaTotal

Mi metodo
Producto 1 peso 0.3 cantidad 3 = 0.9
Producto 2 peso 0.25 cantidad 2 = 0.5
SumaTotal = 1.4


Como sea el DISTINCT deberia ir dentro del COUNT para que cuente cada numero una sola vez:
1
2
3
4
5
6
7
8
SELECT COUNT(DISTINCT PM.numero) AS cantNumero
     , TE.fecha AS fecha
     , SUM(DE.peso_unitario * AP.cantidad) AS SumaTotal
FROM pedido_modelo PM
INNER JOIN turno_entrega TE ON PM.turno_entrega_id=TE.id
INNER JOIN alimento_pedido AP ON PM.numero=AP.pedido_numero
INNER JOIN detalle_alimento DE ON AP.detalle_alimento_id=DE.id_detallealimento
GROUP BY fecha
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
sin imagen de perfil

INNER JOIN multiplica resultados

Publicado por Nicolas (3 intervenciones) el 26/11/2014 17:32:41
Hice la prueba en papel, luego en phpMyAdmin y resulto ser esta la respuesta, estaba realizando mal la suma :P

Muchas gracias por haberme ayudado!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar