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

[SOLUCIONADO] Inner join y Left join

Estas en el tema de Inner join y Left join en el foro de Mysql en Foros del Web. Quisiera saber si alguien me puede guiar en este lio @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original SELECT plani.fechaPlanilla , plani.costoCliente , emp.nombreApellido , SUM ( ...
  #1 (permalink)  
Antiguo 24/05/2013, 17:53
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Inner join y Left join

Quisiera saber si alguien me puede guiar en este lio
Código MySQL:
Ver original
  1. SELECT plani.fechaPlanilla, plani.costoCliente, emp.nombreApellido, SUM(entPorta+entCel) AS totalEntregadas, SUM(devPorta+devCel) AS totalDev, SUM(sinDocPorta+sinDocCel) AS totalSinDoc, SUM(entPorta+entCel+devPorta+devCel+sinDocPorta+sinDocCel) AS totalMes, SUM(sueldo) AS totalSueldo, count(DAY(fechaPlanilla)) AS diasTrabajados
  2.         FROM planillaDiaria AS plani JOIN empleados AS emp
  3.         WHERE plani.idEmpleado=emp.id AND MONTH(plani.fechaPlanilla)=MONTH('".$informe->getDesde()."')
  4.         GROUP BY plani.idEmpleado, MONTH('".$informe->getDesde()."') ORDER BY emp.nombreApellido ASC;

Necesito hacer una sub consulta que sume los adelantos de la tabla "vales" segun el mes seleccionado, cuando le agrego esto si el cadete tiene 2 adelantos, me duplica los demas valores, se entiende?

Desde ya mil gracias a quien pueda ayudarme!!!

Última edición por gnzsoloyo; 24/05/2013 a las 17:54 Razón: Usar Highlight "SQL" o "MySQL".
  #2 (permalink)  
Antiguo 24/05/2013, 18:20
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: Inner join y Left join

Cita:
Necesito hacer una sub consulta que sume los adelantos de la tabla "vales" segun el mes seleccionado, cuando le agrego esto si el cadete tiene 2 adelantos, me duplica los demas valores, se entiende?
La información que nos das es algo parcial.
No está la tabla "Vales" mencionada, ni conocemos las estructuras de las tablas y sus relaciones.
El hecho de que se duplique puede implicar que la relación de la consulta donde la incluyas esté forzada o mal planteada.
Tienes que tener en cuenta que si no hay relación de dependencia funcional directa entre el empleado, la planilla y los vales, es muy probable que estes creando un producto cartesiano.
En esencia: Que dos tablas se relacionen con una tercera (empleados), no implica necesariamente que se puedan relacionas las tres al mismo tiempo.
Tengo una idea acerca de a qué te refieres, pero no veo claramente qué tipo de datos representa la tabla Planilla, y cómo intervienen los vales, como para estar seguro.
__________________
¿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 24/05/2013, 18:34
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Inner join y Left join

Muchas gracias por la respuesta y por tu tiempo, te comento
Tengo las tablas:

empleados
planilla
vales

planilla tiene el id del empleado, y vales tambien tiene el id del empleado.

Debo listar las planillas de todos los empleado de un mes determinado agrupo por mes (hasta aca todo bien), armo una grilla con todos los datos y en esta grilla hay una columna "vales", por ende deberia sumar todos los vales por cada empleado y que se correspondan al mes solicitado.

La verdad hace mucho que no hago nada de sql y estoy medio perdido.

Espero que sirva la info, si no por favor dime que debomostrarles.
  #4 (permalink)  
Antiguo 25/05/2013, 06:12
 
Fecha de Ingreso: enero-2013
Mensajes: 14
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Inner join y Left join

Bueno parece que encontre la solucion, dejo el codigo por si a alguien mas le sirve

Código MySQL:
Ver original
  1. SELECT emp.id AS idEmp, emp.nombreApellido, plani.totalSueldo, vale.totalVales, plani.diasTrabajados,
  2.         plani.mes, plani.totalEntregadas, plani.totalSinDoc, plani.totalDev, plani.totalMes, plani.costoCliente
  3.         FROM empleados AS emp
  4.         INNER JOIN(SELECT plani.fechaPlanilla, plani.idEmpleado, SUM(plani.sueldo) AS totalSueldo, count(DAY(fechaPlanilla)) AS diasTrabajados,
  5.         MONTH(fechaPlanilla) AS mes, SUM(entPorta+entCel) AS totalEntregadas, SUM(sinDocPorta+sinDocCel) AS totalSinDoc, SUM(devPorta+devCel) AS totalDev, SUM(entPorta+entCel+devPorta+devCel+sinDocPorta+sinDocCel) AS totalMes, plani.costoCliente
  6.         FROM planillaDiaria AS plani WHERE MONTH(plani.fechaPlanilla)=MONTH('".$informe->getDesde()."')
  7.         GROUP BY plani.idEmpleado) plani ON plani.idEmpleado=emp.id LEFT JOIN(SELECT vale.idEmpleado, SUM(vale.importeVale) AS totalVales, vale.fechaVale
  8.         FROM vales AS vale WHERE MONTH(vale.fechaVale)=MONTH('".$informe->getDesde()."')
  9.         AND fechaAnulacion='0000-00-00'
  10.         GROUP BY vale.idEmpleado) vale ON vale.idEmpleado=emp.id ORDER BY emp.nombreApellido

Esto relaciona tres tablas:

empleados - id empleado, otro campos
planilladiaria - idempleado, otros campos
vales - idempleado, otros campos

Etiquetas: join, left, select, tabla
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 06:03.