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

Resultados de dos tablas diferentes

Estas en el tema de Resultados de dos tablas diferentes en el foro de Bases de Datos General en Foros del Web. Quiero hacer es sumar de las tablas det_comisiones y det_entradas los totales vinculados por el id_entrada de la tabla entradas. el problema esta que cuando ...
  #1 (permalink)  
Antiguo 31/05/2005, 08:08
 
Fecha de Ingreso: mayo-2005
Mensajes: 217
Antigüedad: 19 años, 5 meses
Puntos: 5
Resultados de dos tablas diferentes

Quiero hacer es sumar de las tablas det_comisiones y det_entradas los totales
vinculados por el id_entrada de la tabla entradas. el problema esta que
cuando una de las dos tablas tiene mas registros me repite en la suma los registros:
Esta es la consulta que hice:

SELECT entradas.*,SUM(det_entradas.unidades * det_entradas.precio)as base,SUM(det_comisiones)as impcom
FROM entradas
LEFT JOIN det_entradas ON det_entradas.id_entrada=entradas.id_entrada
LEFT JOIN det_comisiones ON det_comisiones.id_entrada=entradas.id_entrada
GROUP BY tblentradas.id_entrada

Las tablas:
entradas` (
`id_entradae` int(10) unsigned NOT NULL auto_increment,
`codigoentrada` int(10) unsigned default NULL,
...
PRIMARY KEY (`id_entrada`),
----------------
det_entradas` (
`id_detalle` int(10) unsigned NOT NULL auto_increment,
`id_entrada` int(10) unsigned default NULL,
`unidades` int(10) unsigned default NULL,
`precio` double(10,2) default NULL,
PRIMARY KEY (`id_detalle`),
-----------------
det_comisiones` (
`id_detalle` int(10) unsigned NOT NULL auto_increment,
`porcentajecom` double(10,2) default NULL,
PRIMARY KEY (`id_detalle`),
  #2 (permalink)  
Antiguo 01/06/2005, 01:13
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 3 meses
Puntos: 2
En la tabla det_comisiones no tienes id_entrada, ¿o es un error?.
De todas formas, a mi entender, tal como tienes definida la estructura de tus tablas, te faltaría una condición para cruzar det_entradas con det_comisiones, y es la igualdad del campo id_detalle.
La consulta que pones tiene varios errores: no se puede hacer la suma de una tabla, sino que se hace de un campo de una tabla.
Con la estructura que pones ahí, la consulta sería:
Código:
SELECT entradas.identrada,SUM(det_entradas.unidades * det_entradas.precio)as base,SUM(det_comisiones.porcentajecom)as impcom
FROM entradas
LEFT JOIN det_entradas ON det_entradas.id_entrada=entradas.id_entrada
LEFT JOIN det_comisiones ON det_comisiones.id_detalle=det_entradas.id_detalle
GROUP BY tblentradas.id_entrada
Te lo pongo con el left join igual que lo has puesto, pero eso lo único que hará será hacerte aparecer entradas.id_entradas que no tengan datos en det_entradas, con lo que tienes que plantearte si realmente lo necesitas.
Evidentemente: si una entrada.identrada tiene más de un registro en la tabla det_entradas te los va a sumar, pero es así como tiene que funcionar, ¿sino para que hacer la suma?.
El problema real lo tienes si la relación det_entradas con det_comisiones no es unívoca (1 a 1), porque ahí es donde se producirían las repeticiones. Fíjate que si un detalle tiene más de una comisión, aparecerá repetida y, por lo tanto, la sumará dos veces.

Por cierto, en el otro post con el mismo tema no contestaste a las preguntas que te hice.

Un saludo.
Un saludo.
__________________
Estoy contagiado de Generación-I

Última edición por Vice; 01/06/2005 a las 04:34
  #3 (permalink)  
Antiguo 01/06/2005, 02:51
 
Fecha de Ingreso: mayo-2005
Mensajes: 217
Antigüedad: 19 años, 5 meses
Puntos: 5
sory, no me di cuenta de los errores que escribi en la consulta y en la esctructura.
la consulta quedaria:

SELECT entradas.*,SUM(det_entradas.unidades * det_entradas.precio)as base,SUM(det_comisiones.porcentajecom)as impcom
FROM entradas
INNER JOIN det_entradas ON det_entradas.id_entrada=entradas.id_entrada
INNER JOIN det_comisiones ON det_comisiones.id_entrada=entradas.id_entrada
GROUP BY tblentradas.id_entrada

Las tablas:
entradas` (
`id_entrada` int(10) unsigned NOT NULL auto_increment,
`codigoentrada` int(10) unsigned default NULL,
`id_cliente` int(10) unsigned default NULL,

...
PRIMARY KEY (`id_entrada`),
----------------
det_entradas` (
`id_detalle` int(10) unsigned NOT NULL auto_increment,
`id_entrada` int(10) unsigned default NULL,
`unidades` int(10) unsigned default NULL,
`precio` double(10,2) default NULL,
PRIMARY KEY (`id_detalle`),
-----------------
det_comisiones` (
`id_detalle` int(10) unsigned NOT NULL auto_increment,
`id_entrada` int(10) unsigned default NULL,
`porcentajecom` double(10,2) default NULL,
PRIMARY KEY (`id_detalle`),

las unicas relaciones que tengo son de la tabla entrada con det_entrada
y entrada con det_comisiones, para sumar los totales de sus importes en la tabla comisiones y los totales de los porcentajes en la tabla det_comisiones
de cada id_entrada de la tabla entrada.
Un ejemplo:

tabla entrada
------------------------------------
id_entrada|codigoentrada|id_cliente
22 |000001 |1

tabla det_entrada
------------------------------------
id_detalle|id_entrada|unidades*importe|
1 |22 |35
2 |22 |50
3 |22 |50

tabla det_comisiones
------------------------------------
id_detalle|id_entrada|porcentajecom|
13 |22 |10
14 |22 |5

y como resultado tendria que salir

|id_entrada|SUM(porcentajecom)|SUM(precio*unidades )|id_cliente
22 |15 |135 |1

y aca donde en realidad en SUM(porcentajecom) me suma 45,
no tengo mucha idea si la consulta la puedo hacer asi o si hay otra solucion

disculpas por lo del otro post que no lo respondi, antes de ayer fue la primera ves que entre en esto de los foros y estaba medio desorientado. pero ya me esta quedando claro como funcionan.
Un saludo
  #4 (permalink)  
Antiguo 01/06/2005, 05:10
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 3 meses
Puntos: 2
Esta última opción parece correcta, pero dependerá de si la versión de mysql que usas admite subconsultas o no.
Un saludo.
__________________
Estoy contagiado de Generación-I
  #5 (permalink)  
Antiguo 01/06/2005, 09:11
 
Fecha de Ingreso: mayo-2005
Mensajes: 217
Antigüedad: 19 años, 5 meses
Puntos: 5
De acuerdo

Borre la entrada anterior donde ponia una respuesta porque estaba incorrecta(para el que la leyo),
Ahora si creo que esto funca, asique si se les ocurre algo mejor...

SELECT entradas.*, a.*FROM tblentradas INNER JOIN
(SELECT * from
(SELECT SUM(det_entradas.precio*det_entradas.unidades),det _entradas.id_entrada
FROM entradas INNER JOIN det_entradas ON entradas.id_entrada = det_entradas.id_entrada
group by tblentradas.id_entrada) as det_ent
LEFT JOIN
(SELECT SUM(det_comerciales.porcentajecom),det_comerciales .id_entrada
FROM entradas INNER JOIN det_comerciales ON entradas.id_entrada = det_comerciales.id_entrada
group by entradas.id_entrada)as det_com
ON det_ent.id_entrada= det_com.id_entrada)as a ON entradas.id_entrada= a.id_entrada
INNER JOIN clientes ON entradas.id_cliente=clientes.id_cliente
  #6 (permalink)  
Antiguo 02/06/2005, 05:22
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 21 años, 3 meses
Puntos: 2
Lo que pones no te va a devolver lo que pides:
Código:
select identrada, select sum(det_comisiones.porcentaje) from det_comisiones where det_comisiones.identrada=entradas.identrada, select sum(det_entradas.precio*det_entradas.unidades) frmo det_entradas where det_entradas.identrada=entradas.identrada
from entradas
No tengo forma de probar si esto es correcto, pues la versión de mysql que actualmente uso no admite los subselects. Pero pienso esto debería acercarse mucho a lo que tu quieres obtener.

De todas formas, me gustaría conocer un poco la explicación de las tablas, su estructura y sus relaciones, pues no acabo de tenerlo claro, sobre todo el campo iddetalle en det_entradas y det_comisiones.
Un saludo.
__________________
Estoy contagiado de Generación-I
  #7 (permalink)  
Antiguo 03/06/2005, 02:43
 
Fecha de Ingreso: mayo-2005
Mensajes: 217
Antigüedad: 19 años, 5 meses
Puntos: 5
Muchas gracias vice, me vino al pelo, me simplificastes las cosas, me esta estaba haciendo un quilombo con tantos join anidados.

Mas o menos el funcionamiento de mis tablas es el siguiente :
Tengo una tabla entradas en la que entran trabajos, cada entrada esta relacionada con dos tablas (1 a varios). una tabla es la de detalles del trabajo que entran todos los articulos del trabajo,sus precio y unidades.
y la otra es la de comisiones, en la que puedo cargar varias comisiones de diferentes trabajadores. Ademas la tabla entradas se relaciona con sus clientes.

Las tablas:
entradas` (
`id_entrada` int(10) unsigned NOT NULL auto_increment,
`id_estado` int(10) unsigned NOT NULL auto_increment,
`codigoentrada` int(10) unsigned default NULL,
`id_cliente` int(10) unsigned default NULL,
`IVA` int(10) unsigned default NULL,
`Descuento` int(10) unsigned default NULL,
...
PRIMARY KEY (`id_entrada`),
----------------
det_entradas` (
`id_detalle` int(10) unsigned NOT NULL auto_increment,
`id_entrada` int(10) unsigned default NULL,
`id_articulo` int(10) unsigned default NULL,
`unidades` int(10) unsigned default NULL,
`precio` double(10,2) default NULL,
PRIMARY KEY (`id_detalle`),
-----------------
det_comisiones` (
`id_detalle` int(10) unsigned NOT NULL auto_increment,
`id_entrada` int(10) unsigned default NULL,
`id_trabajador` int(10) unsigned default NULL,
`porcentajecom` double(10,2) default NULL,
PRIMARY KEY (`id_detalle`),

con estas tablas quiero mostrar por cada entrada los totales por entradas
de todos los detalles y el total de comisiones por cada entrada. Cosa que se me habia complicado pero lo solucione (gracias denuevo vice) con la consulta que pusistes arriba:

SELECT
tblentradas.id_entrada,tblentradas.codigoentrada,t blentradas.nombretrabajo,
tblentradas.fecha_ent,tblentradas.id_ingreso,tblen tradas.fecha_sal,tblentradas.id_salida,tblentradas .descuento,
tblentradas.iva,tblentradas.irpf,tblentradas.id_es tado,tbldptos.codigodpto,medios_ent.nombremedio as nombreingreso,medios_sal.nombremedio as nombresalida,tblclientes.nombrecliente,
(SELECT @f:=SUM(tbldetcomisiones.porcentajecom) from tbldetcomisiones
where tbldetcomisiones.id_entrada=tblentradas.id_entrada ),(select @s:=sum(tbldetentradas.precio*tbldetentradas.unida des) from tbldetentradas
where tbldetentradas.id_entrada=tblentradas.id_entrada)a s base,(((@s-((@s*tblentradas.descuento)/100))*@f)/100)as totalcomi,((@s*tblentradas.descuento)/100)as impdesc,((@s*tblentradas.iva)/100)as impiva,((@s*tblentradas.irpf)/100)as impirpf
from tblentradas
INNER JOIN tblclientes ON tblentradas.id_cliente=tblclientes.id_cliente
INNER JOIN tbldptos ON tblentradas.id_dpto=tbldptos.id_dpto
LEFT JOIN tblmedios as medios_ent ON tblentradas.id_ingreso=medios_ent.id_medio
LEFT JOIN tblmedios as medios_sal ON tblentradas.id_salida=medios_sal.id_medio ".$busqueda." group by id_entrada";


$busqueda=es un where para filtrar (mes y año), clientes.. etc)
al final de todo tambien quiero mostrar los resultados de la suma de todas las entradas que lo que hice fue utilizar la misma consulta anteriror agregandoles unos SUM:

Select tblentradas.id_entrada,tblentradas.descuento,tblen tradas.iva,tblentradas.irpf,
SUM((SELECT @f:=SUM(tbldetcomerciales.porcentajecom)from tbldetcomerciales
where tbldetcomerciales.id_entrada=tblentradas.id_entrad a)),
SUM((select @s:=sum(tbldetentradas.precio*tbldetentradas.unida des) from tbldetentradas
where tbldetentradas.id_entrada=tblentradas.id_entrada)) as base,
SUM((((@s-((@s*tblentradas.descuento)/100))*@f)/100))as totalcomi,SUM(((@s*tblentradas.descuento)/100))as impdesc,SUM(((@s*tblentradas.iva)/100))as impiva,SUM(((@s*tblentradas.irpf)/100))as impirpf
from tblentradas ".$busqueda." group by ' ' "

Hasta ahy to bien creo, pero luego quiero utilizar las misma tabla de entrada
para hacer albaranes y facturas, es decir de una o mas entradas crear un albaran que estaria relacionado con entradas de vaias entradas a un albaran:

tblalbaranes` (
`id_albaran` int(10) unsigned NOT NULL auto_increment,
`id_entrada` int(10) unsigned default NULL,
`codigoalbaran` int(10) unsigned default NULL,
`fecha` DATE default NULL,
PRIMARY KEY (`id_detalle`),

y luego me ocurriria lo mismo que con las entradas tendria que listar totales por albaran y totales generales para lo cual la consulta quedaria:

SELECT tblalbaranes.*,tblentradas.id_entrada,tblentradas. codigoentrada,tblentradas.nombretrabajo,
tblentradas.fecha_ent,tblentradas.id_ingreso,tblen tradas.fecha_sal,tblentradas.id_salida,tblentradas .descuento,
tblentradas.iva,tblentradas.irpf,tblentradas.id_es tado,tbldptos.codigodpto,tblclientes.nombrecliente ,
SUM((SELECT @f:=SUM(tbldetcomisiones.porcentajecom)from tbldetcomisiones
where tbldetcomisiones.id_entrada=tblentradas.id_entrada )),
SUM((select @s:=sum(tbldetentradas.precio*tbldetentradas.unida des) from tbldetentradas
where tbldetentradas.id_entrada=tblentradas.id_entrada)) as base,
SUM((((@s-((@s*tblentradas.descuento)/100))*@f)/100))as totalcomi,SUM(((@s*tblentradas.descuento)/100))as impdesc,SUM(((@s*tblentradas.iva)/100))as impiva,SUM(((@s*tblentradas.irpf)/100))as impirpf
from tblentradas
INNER JOIN tblalbaranes ON tblentradas.id_entrada=tblalbaranes.id_entrada
INNER JOIN tblclientes ON tblentradas.id_cliente=tblclientes.id_cliente
INNER JOIN tbldptos ON tblentradas.id_dpto=tbldptos.id_dpto ".$busqueda." group by tblalbaranes.codigoalbaran";

basicamente este seria el funcionamiento y estructura de mi base de datos.

Lo que no pude lograr en la misma consulta es cuando listo los albaranes o facturas agregarles un campo en el que me muetre a que entradas pertenecen
lo tuve que hacer dentro del
while($registro=mysql_fetch_array($albaranes)) {

}asiendo consulta por cada registro, por eso habia agregado un post en el que queria concatenar filas en un campo.

bueno un saludazo, y hasta la proxima
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 14:33.