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

Problema para unir 3 tablas incluyendo la sentencia SUM

Estas en el tema de Problema para unir 3 tablas incluyendo la sentencia SUM en el foro de Mysql en Foros del Web. Saludos cordiales a todos, les comento mi problema: Quiero unir tres tablas 1. Producto (codigo, desc, ubicacion,...) 2. Nota Salida (id_salida, documento, codigo, cantidad, costo) ...
  #1 (permalink)  
Antiguo 28/11/2011, 16:00
airknightz
Invitado
 
Mensajes: n/a
Puntos:
Problema para unir 3 tablas incluyendo la sentencia SUM

Saludos cordiales a todos, les comento mi problema: Quiero unir tres tablas
1. Producto (codigo, desc, ubicacion,...)
2. Nota Salida (id_salida, documento, codigo, cantidad, costo)
3. Nota Entrada (id_entrada, documento, codigo, cantidad, costo)

las tabla nota de salida y entrada actúan como detalles de la cabecera (tabla producto) y lo que busco es sumar el campo cantidad de todas las notas de salida por cada codigo de producto, y lo mismo para la nota de entrada pero quiero hacerlo en una sola consulta, debido a que estoy dando mantenimiento a un sistema ya desarrollado.

He desarrollado dos consultas pero con errores:

La primera con el JOIN
SELECT p.id, p.codigo, p.nombre, p.stock, p.medida, p.tipo, p.grupo, p.posicion, p.estado, p.sis, p.almacen, p.captura1, p.ubicacion1, p.conteo1, p.captura2, p.ubicacion2, p.conteo2, p.captura3, p.ubicacion3, p.conteo3, p.captura4, p.ubicacion4, p.conteo4, captura5, p.ubicacion5, p.conteo5, captura6, p.ubicacion6, p.conteo6, p.captura7, p.ubicacion7, p.conteo7, p.captura8, p.ubicacion8, p.conteo8, SUM( s.cantidad ) + SUM( s.cantidad2 ) + SUM( s.cantidad3 ) + SUM( s.cantidad4 ) + SUM( s.cantidad5 ) + SUM( s.cantidad6 ) + SUM( s.cantidad7 ) + SUM( s.cantidad8 ) AS SALIDA, SUM( ent.cantidad ) + SUM( ent.cantidad2 ) + SUM( ent.cantidad3 ) + SUM( ent.cantidad4 ) + SUM( ent.cantidad5 ) + SUM( ent.cantidad6 ) + SUM( ent.cantidad7 )
+ SUM( ent.cantidad8 ) AS ENTRADA FROM planilla AS p
LEFT JOIN salida AS s ON p.codigo=s.codigo WHERE p.sis =0
LEFT JOIN entrada AS ent ON p.codigo = ent.codigo WHERE p.sis =0
GROUP BY p.codigo ORDER BY p.codigo

y la segunda con el UNION

(SELECT p.id, p.codigo, p.nombre, p.stock, p.medida, p.tipo, p.grupo, p.posicion, p.estado, p.sis, p.almacen, p.captura1, p.ubicacion1, p.conteo1, p.captura2, p.ubicacion2, p.conteo2, p.captura3, p.ubicacion3, p.conteo3, p.captura4, p.ubicacion4, p.conteo4, captura5, p.ubicacion5, p.conteo5, captura6, p.ubicacion6, p.conteo6, p.captura7, p.ubicacion7, p.conteo7, p.captura8, p.ubicacion8, p.conteo8, SUM( s.cantidad ) + SUM( s.cantidad2 ) + SUM( s.cantidad3 ) + SUM( s.cantidad4 ) + SUM( s.cantidad5 ) + SUM( s.cantidad6 ) + SUM( s.cantidad7 ) + SUM( s.cantidad8 ) AS SALIDA FROM planilla AS p
LEFT JOIN salida AS s ON p.codigo=s.codigo
WHERE p.sis =0
GROUP BY p.codigo ORDER BY pla.codigo)
UNION
(SELECT pla.codigo,SUM( ent.cantidad ) + SUM( ent.cantidad2 ) + SUM( ent.cantidad3 ) + SUM( ent.cantidad4 ) + SUM( ent.cantidad5 ) + SUM( ent.cantidad6 ) + SUM( ent.cantidad7 ) + SUM( ent.cantidad8 ) AS ENTRADA, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null, null,null, null FROM planilla AS pla LEFT JOIN entrada AS ent ON pla.codigo = ent.codigo WHERE pla.sis =0
GROUP BY pla.codigo ORDER BY pla.codigo);

Los null van porque la documentacion de UNION dice que ambas consultas deben tener la misma cantidad de campos
  #2 (permalink)  
Antiguo 28/11/2011, 16:19
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: Problema para unir 3 tablas incluyendo la sentencia SUM

Cita:
lo que busco es sumar el campo cantidad de todas las notas de salida por cada codigo de producto, y lo mismo para la nota de entrada pero quiero hacerlo en una sola consulta,
¿Qué tiene que ver la tabla "planilla" en todo esto?
¿Cuál es su estructura?
¿Por qué tiene ocho campos que comienzan con "cantidad"?

Por el planteo que haces, no sólo estás haciendo una discriminación por codigo de producto, sino por alguna otra cosa, y eso hace que la consulta que propones no parezca tener nada que ver con el planteo original.

¿Podrías aclarar un poco más qué tiene que ver ese esquema de consulta de 36 campos con las tablas que muestras al principio?
__________________
¿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 29/11/2011, 11:23
airknightz
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Problema para unir 3 tablas incluyendo la sentencia SUM

Disculpen, aquí les detallo el problema:
Tengo 3 tablas:
CREATE TABLE IF NOT EXISTS `planilla` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`codigo` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`nombre` varchar(150) COLLATE utf8_spanish_ci NOT NULL,
`stock` decimal(10,0) NOT NULL DEFAULT '0',
`medida` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`tipo` varchar(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`grupo` varchar(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`posicion` varchar(100) COLLATE utf8_spanish_ci DEFAULT NULL,
`estado` varchar(100) COLLATE utf8_spanish_ci DEFAULT NULL,
`almacen` varchar(200) COLLATE utf8_spanish_ci DEFAULT NULL,
`comentario` varchar(200) COLLATE utf8_spanish_ci DEFAULT NULL,
`user` int(11) DEFAULT NULL,
`sis` int(1) DEFAULT NULL,
`captura1` int(11) DEFAULT NULL,
`conteo1` decimal(10,0) DEFAULT '0',
`ubicacion1` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura2` int(11) DEFAULT NULL,
`conteo2` decimal(10,0) DEFAULT '0',
`ubicacion2` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura3` int(11) DEFAULT NULL,
`conteo3` decimal(10,0) DEFAULT '0',
`ubicacion3` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura4` int(11) DEFAULT NULL,
`conteo4` decimal(10,0) DEFAULT '0',
`ubicacion4` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura5` int(11) DEFAULT NULL,
`conteo5` decimal(10,0) DEFAULT '0',
`ubicacion5` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura6` int(11) DEFAULT NULL,
`conteo6` decimal(10,0) DEFAULT '0',
`ubicacion6` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura7` int(11) DEFAULT NULL,
`conteo7` decimal(10,0) DEFAULT '0',
`ubicacion7` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
`captura8` int(11) DEFAULT NULL,
`conteo8` decimal(10,0) DEFAULT '0',
`ubicacion8` char(10) COLLATE utf8_spanish_ci DEFAULT NULL,
PRIMARY KEY (`id`,`codigo`),
UNIQUE KEY `id_UNIQUE` (`id`),
KEY `fk_planilla_1` (`user`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

CREATE TABLE IF NOT EXISTS `salida` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numero` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`fecha` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`numero`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

CREATE TABLE IF NOT EXISTS `salida_detalle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numero` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`codigo` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`cantidad` int(11) NOT NULL DEFAULT '0',
`costo` decimal NOT NULL DEFAULT '0',
UNIQUE KEY `id_UNIQUE` (`id`),
FOREIGN KEY (`numero`) REFERENCES salida(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

CREATE TABLE IF NOT EXISTS `entrada` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numero` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`fecha` datetime DEFAULT NULL,
PRIMARY KEY (`id`,`numero`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

CREATE TABLE IF NOT EXISTS `entrada_detalle` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`numero` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`codigo` varchar(50) COLLATE utf8_spanish_ci NOT NULL,
`cantidad` int(11) NOT NULL DEFAULT '0',
`costo` decimal NOT NULL DEFAULT '0',
UNIQUE KEY `id_UNIQUE` (`id`),
FOREIGN KEY (`numero`) REFERENCES entrada(`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

Y requiero hacer una consulta que me muestre los campos de la tabla planilla más los totales en salidas detalles y entradas detalles agrupados por el campo codigo (que hace referencia a un Item).

He realizado la siguiente consulta, pero me arroja distintos valores( con referencia a totales en salida_detalle y entrada_detalle) a los que se existen en la BDD:

SELECT p.id, p.codigo, p.nombre, p.stock, p.medida, p.tipo, p.grupo, p.posicion, p.estado, p.sis, p.almacen, p.captura1, p.ubicacion1, p.conteo1, p.captura2, p.ubicacion2, p.conteo2, p.captura3, p.ubicacion3, p.conteo3, p.captura4, p.ubicacion4, p.conteo4, captura5, p.ubicacion5, p.conteo5, captura6, p.ubicacion6, p.conteo6, p.captura7, p.ubicacion7, p.conteo7, p.captura8, p.ubicacion8, p.conteo8, SUM(s.cantidad) AS TOTAL_SALIDA, SUM(e.cantidad) AS TOTAL_ENTRADA FROM planilla AS p LEFT JOIN salida_detalle AS s ON p.codigo=s.codigo LEFT JOIN entrada_detalle AS e ON p.codigo = e.codigo WHERE p.sis = 0 GROUP BY p.codigo ORDER BY p.codigo";

Etiquetas: innerjoin, null, union
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 00:35.