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

Duplicados en consulta con INNER JOIN en misma tabla

Estas en el tema de Duplicados en consulta con INNER JOIN en misma tabla en el foro de Bases de Datos General en Foros del Web. Hola, estoy intentando obtener un resultado que involucra 3 tablas (productos, productosprecios, productosstockmovimientos). Necesito obtener de la tabla Productos , el campo Codigo, de la ...
  #1 (permalink)  
Antiguo 25/05/2011, 09:48
 
Fecha de Ingreso: mayo-2011
Mensajes: 7
Antigüedad: 12 años, 10 meses
Puntos: 0
Duplicados en consulta con INNER JOIN en misma tabla

Hola, estoy intentando obtener un resultado que involucra 3 tablas (productos, productosprecios, productosstockmovimientos). Necesito obtener de la tabla Productos, el campo Codigo, de la tabla productosprecios el Precio de Tipo 1 y el Precio de Tipo 2 y aqui lo mas dificil, necesito sumar la Cantidad de Tipo 0 y restarle la Cantidad de Tipo 1 de la tabla productosstockmovimientos

El resultado que busco es este
Código:
Codigo    PrecioGremio    PrecioPublico    Stock
3001704   18.36               0                2
Estos son algunos de los campos de las tablas, para el producto con Codigo 3001704

Tabla productos, para el producto Codigo 3001704
Código:
RecID                   Codigo 	
8,%53y#|!!4¢         3001704
Tabla productosprecios para el IDProducto 8,%53y#|!!4¢
Código:
RecID              	IDProducto 	Precio 	NroLista
8,%53y$z!!4ƒ 	8,%53y#|!!4¢          	18.36 	1
8,%53y$|!!4¨ 	8,%53y#|!!4¢          	0 	2
8,%53y$~!!4l 	8,%53y#|!!4¢          	0 	3
8,%53y$€!!4¸ 	8,%53y#|!!4¢          	0 	4
8,%53y$¢!!4µ 	8,%53y#|!!4¢          	0 	5
8,%53y$£!!4^ 	8,%53y#|!!4¢           	0 	6
Tabla productosstockmovimientos para el IDProducto 8,%53y#|!!4¢
Código:
RecID            IDProducto     IDDeposito         IDFiscal    Cantidad  Tipo
8,(&4fyæ!!#1 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8+&,-5]=!!#÷ 	1 	0
8,*%,<71!!4m 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8*-:.ha1!!#^ 	2 	0
8,*%,<`(!!4¿ 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8+&,-5]=!!#÷ 	2 	1
8,,&11.k!!4i 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8+&,-5]=!!#÷ 	1 	1
8.(<0=$»!!#< 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8*-:.ha1!!#^ 	10 	0
8.(<0>6!!!#x 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8*-:.ha1!!#^ 	10 	1
8.(<0fa¬!!#s 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8*-:.ha1!!#^ 	5 	0
8.(<0gnc!!#4 	8,%53y#|!!4¢ 	8,&?5ouƒ!!#< 	8*-:.ha1!!#^ 	3 	1
Esta consulta me funciona, me trae exactamente lo que necesito para el IDProducto 8,%53y#|!!4¢ y para todos los productos de la tabla productos pero no me parece para nada elegante. Fijense que para la columna Stock, tengo que hacer un SELECT anidado en el sector de columnas de resultado, al comienzo del SELECT principal.

Me pregunto si alguien sabe si se puede hacer a puro JOIN.

Código MySQL:
Ver original
  1. SELECT prod.Codigo
  2.      , pp1.Precio AS PrecioGremio
  3.      , pp2.Precio AS PrecioPublico
  4.      , ( SELECT (SUM(pm1.Cantidad) -
  5.                   (
  6.                     SELECT SUM(pm2.Cantidad)
  7.                     FROM productosstockmovimientos AS pm2
  8.                     WHERE pm2.IDProducto = prod.RecID AND pm2.Tipo=1
  9.                   )
  10.                 )
  11.          FROM productosstockmovimientos AS pm1
  12.          WHERE pm1.IDProducto = prod.RecID AND pm1.Tipo=0
  13.        ) AS Stock
  14. FROM productos AS prod
  15.   JOIN productosprecios AS pp1
  16.     ON prod.RecID = pp1.IDProducto
  17.     AND pp1.NroLista = 1
  18.   JOIN productosprecios as pp2
  19.     ON prod.RecID = pp2.IDProducto
  20.     AND pp2.NroLista = 2
  21. WHERE prod.Inhabilitado = 0 AND prod.RecID = '8,%53y#|!!4¢'
  22. ORDER BY prod.Codigo ASC

Desde ya muchas gracias!
  #2 (permalink)  
Antiguo 27/05/2011, 07:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duplicados en consulta con INNER JOIN en misma tabla

SELECT codigo, sum(if(tipo=0,cantidad,0))-sum(if(tipo=1,cantidad,0)) as saldo form productosstockmovimientos
group by codigo

...

la funcion if puede ser distinta segun el motor que estes usando (access usa IIF)
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 27/05/2011, 08:46
 
Fecha de Ingreso: mayo-2011
Mensajes: 7
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Duplicados en consulta con INNER JOIN en misma tabla

Hola, muchas gracias por la respuesta, ahora mi consulta esta así

Código MySQL:
Ver original
  1. SELECT prod.Codigo
  2.      , FORMAT(pp1.Precio,2) AS PrecioGremio
  3.      , FORMAT(pp2.Precio,2) AS PrecioPublico
  4.      , ( SELECT SUM(IF(psm.Tipo=0,psm.Cantidad,0)) - SUM(IF(psm.Tipo=1,psm.Cantidad,0))
  5.          FROM productosstockmovimientos AS psm
  6.          WHERE psm.IDProducto =  prod.RecID
  7.        ) AS Stock
  8. FROM productos AS prod
  9.   JOIN productosprecios AS pp1
  10.     ON prod.RecID = pp1.IDProducto
  11.     AND pp1.NroLista = 1
  12.   JOIN productosprecios as pp2
  13.     ON prod.RecID = pp2.IDProducto
  14.     AND pp2.NroLista = 2
  15. WHERE prod.Inhabilitado = 0
  16. ORDER BY prod.Codigo ASC

El resultado es este
Código:
Codigo        PrecioGremio     PrecioPublico            Stock
04000812             224.00             249.88           NULL
1                     0.75                0.80           NULL
100-3765             32.40                0.00           NULL
1003067              12.00              19.00             -88
1003298              41.28             137.60           NULL
1003304              26.40             88.00                -1
3001704              18.36              0.00                 2
Es posible condicionar la columna "Stock" con esta consulta para que me muestre 0 si es NULL o menor que 0?

Gracias!

PD: Mi servidor es
Cita:
Servidor: localhost via TCP/IP
Versión del servidor: 5.0.67-community-nt
Versión del protocolo: 10
Usuario: root@localhost
Juegos de caracteres de MySQL: UTF-8 Unicode (utf8)

Última edición por razor7_996; 27/05/2011 a las 08:56 Razón: Agregado Informacion Servidor
  #4 (permalink)  
Antiguo 28/05/2011, 11:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duplicados en consulta con INNER JOIN en misma tabla

En mysql IF(IFNULL(if(tipo=0,cantidad,0),0)<0,0) serviria.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 30/05/2011, 10:54
 
Fecha de Ingreso: mayo-2011
Mensajes: 7
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Duplicados en consulta con INNER JOIN en misma tabla

Hola, muchísimas gracias por la respuesta, pero tengo un problema, el IF de MySQL espera 3 parámetros, condición, respuesta si verdadero, respuesta si falso http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if

Decidí hacer las comparaciones lógicas, después de hacer la operación aritmética, de esa manera escribo menos código.

Hasta ahora mi consulta es esta, fíjense en la parte que dice "QUE PONGO ACA?", intente renombrando el SELECT con "AS opr", pero al ponerlo como parámetro para devolver si verdadero, me dice que no conoce ese campo...

Código MySQL:
Ver original
  1. SELECT prod.Codigo
  2.      , FORMAT(pp1.Precio,2) AS PrecioGremio
  3.      , FORMAT(pp2.Precio,2) AS PrecioPublico
  4.      , IF(
  5.           (IFNULL(
  6.                  (SELECT SUM(IF(psm.Tipo=0,psm.Cantidad,0)) - SUM(IF(psm.Tipo=1,psm.Cantidad,0))
  7.                   FROM productosstockmovimientos AS psm
  8.                   WHERE psm.IDProducto =  prod.RecID)
  9.                  ,0))
  10.            <0,QUE PONGO ACA?,0) AS Stock
  11. FROM productos AS prod
  12.   JOIN productosprecios AS pp1
  13.     ON prod.RecID = pp1.IDProducto
  14.     AND pp1.NroLista = 1
  15.   JOIN productosprecios AS pp2
  16.     ON prod.RecID = pp2.IDProducto
  17.     AND pp2.NroLista = 2
  18. WHERE prod.Inhabilitado = 0
  19. ORDER BY prod.Codigo ASC

Gracias por la ayuda!
  #6 (permalink)  
Antiguo 31/05/2011, 00:51
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duplicados en consulta con INNER JOIN en misma tabla

IF(IFNULL(if(tipo=0,cantidad,0),0)<0,IFNULL(if(tip o=0,cantidad,0),0),0)

perdon
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 31/05/2011 a las 02:20
  #7 (permalink)  
Antiguo 31/05/2011, 09:30
 
Fecha de Ingreso: mayo-2011
Mensajes: 7
Antigüedad: 12 años, 10 meses
Puntos: 0
Respuesta: Duplicados en consulta con INNER JOIN en misma tabla

Hola, intente de dos maneras y una funciono.

Primera Forma, funciona:
Código MySQL:
Ver original
  1. SELECT prod.Codigo
  2.      , FORMAT(pp1.Precio,2) AS PrecioGremio
  3.      , FORMAT(pp2.Precio,2) AS PrecioPublico
  4.      , IF(IFNULL((SELECT SUM(IF(psm.Tipo=0,psm.Cantidad,0)) - SUM(IF(psm.Tipo=1,psm.Cantidad,0))
  5.                   FROM productosstockmovimientos AS psm
  6.                   WHERE psm.IDProducto =  prod.RecID),0)>0,
  7.           IFNULL((SELECT SUM(IF(psm.Tipo=0,psm.Cantidad,0)) - SUM(IF(psm.Tipo=1,psm.Cantidad,0))
  8.                   FROM productosstockmovimientos AS psm
  9.                   WHERE psm.IDProducto =  prod.RecID),0),
  10.           0) AS Stock
  11. FROM productos AS prod
  12.   JOIN productosprecios AS pp1
  13.     ON prod.RecID = pp1.IDProducto
  14.     AND pp1.NroLista = 1
  15.   JOIN productosprecios AS pp2
  16.     ON prod.RecID = pp2.IDProducto
  17.     AND pp2.NroLista = 2
  18. WHERE prod.Inhabilitado = 0
  19. ORDER BY prod.Codigo ASC
Esta consulta me devuelve 0 si la sumatoria es NULL o menor que cero, y la sumatoria si la misma es mayor a cero.


Segunda Fomra, no funciona:
Código MySQL:
Ver original
  1. SELECT prod.Codigo
  2.      , FORMAT(pp1.Precio,2) AS PrecioGremio
  3.      , FORMAT(pp2.Precio,2) AS PrecioPublico
  4.      , (SELECT SUM(IF(IFNULL(IF(psm.Tipo=0,psm.Cantidad,0),0)>0,IF(psm.Tipo=0,psm.Cantidad,0),0)) -        SUM(IF(IFNULL(IF(psm.Tipo=1,psm.Cantidad,0),0)>0,IF(psm.Tipo=1,psm.Cantidad,0),0))
  5.                   FROM productosstockmovimientos AS psm
  6.                   WHERE psm.IDProducto =  prod.RecID
  7. ) AS Stock
  8. FROM productos AS prod
  9.   JOIN productosprecios AS pp1
  10.     ON prod.RecID = pp1.IDProducto
  11.     AND pp1.NroLista = 1
  12.   JOIN productosprecios AS pp2
  13.     ON prod.RecID = pp2.IDProducto
  14.     AND pp2.NroLista = 2
  15. WHERE prod.Inhabilitado = 0
  16. ORDER BY prod.Codigo ASC
Esta consulta me devuelve NULL y Menores que 0, es como si algo se anulara y me devuelve las cosas sin procesar.

Etiquetas: duplicados, joins, mysql, sumatoria, bases-de-datos
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:05.