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

[SOLUCIONADO] Consulta sql entre varias tablas

Estas en el tema de Consulta sql entre varias tablas en el foro de Bases de Datos General en Foros del Web. Hola a todos. Estoy intentando realizar un sql que me permita realizar una consulta como la que paso a detallar y no sé si es ...
  #1 (permalink)  
Antiguo 14/11/2014, 11:00
 
Fecha de Ingreso: febrero-2014
Ubicación: España
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Consulta sql entre varias tablas

Hola a todos.

Estoy intentando realizar un sql que me permita realizar una consulta como la que paso a detallar y no sé si es posible. He dado vueltas al tema y no sé como enfocarlo. Necesitaría solo un poco de orientación, si es que es posible realizarla.
No importa de que base de datos me deen el ejemplo, yo me busco la vida para aplicarlo sobre la que estoy utilizando, Base100 Cosmos.

Es posible realizar lo siguiente desde sql:
Deseo poder sacar el total de unidades de las ventas de un articulo (dato que se encuentran el la tabla de estadisticas) y además justo
debajo lo mismo pero para todos los artículos equivalentes al articulo principal.

Tablas implicadas:
- Estadisticas.
- Articulos
- ArticulosEquivalentes.


Tabla ARTICULOS
=====================
REF1, DECRIPCION-REF1
REF2, DECRIPCION-REF2
REF3, DECRIPCION-REF3
REF4, DECRIPCION-REF4
REF1B, DECRIPCION-REF1B
REF2B, DECRIPCION-REF2B
REF3B, DECRIPCION-REF3B
REF4B, DECRIPCION-REF4B


Tabla ESTADÍSTICAS
=====================
REF1, 2 UNIDADES, 01/01/2014
REF1, 3 UNIDADES, 10/01/2014
REF2, 2 UNIDADES, 16/03/2014
REF2, 6 UNIDADES, 21/04/2014
REF3, 9 UNIDADES, 06/04/2014
REF3, 1 UNIDADES, 12/05/2014
REF4, 7 UNIDADES, 21/01/2014
REF4, 5 UNIDADES, 10/03/2014
REF1B, 2 UNIDADES, 06/05/2014
REF2B, 2 UNIDADES, 23/03/2014
REF3B, 2 UNIDADES, 17/05/2014


Tabla ARTICULOS EQUIVALENTES
============================
REF1,REF1B
REF1,REF1C
REF2,REF2B
REF2,REF2C
REF3,REF3B
REF3,REF3C
REF4,REF4B
REF4,REF4C


El resultado que dearía sería algo así.

REF1, 5 unidades
REF1B, 2 unidades
REF1C, 0 unidades.
REF2, 8 unidades
REF2B, 2 unidades
REF2C, 0 unidades.
REF3, 10 unidades
REF3B, 2 unidades
REF3C, 0 unidades.
REF4, 12 unidades
REF4B, 2 unidades
REF4C, 0 unidades.

He probado a unir las tres tablas a partir el campo comun, la referencia pero no me funciona
Código SQL:
Ver original
  1. SELECT estadistica.articulo,
  2.          articulosEquivalentes.equivalente,
  3.          articulos.denominacion,
  4.          SUM(estadistica.cantidad) Cantidad
  5.   FROM estadistica, articulos, articulosEquivalentes
  6.  WHERE estadistica.articulo = articulos.articulo
  7.    AND articulos.articulo  = reemplazos.articulo
  8.    AND articulosEquivalentes.articulo = estadistica.articulo
  9.    AND estadistica.fecha BETWEEN '01/01/2014' AND '04/07/2014'
  10.    GROUP BY 1, 2, 3

pero me sacar el total de la referencia principal y es la misma que para los articulos equivalentes. cuando necesitaria la cantidad de cada equivalente.

Articulo Equivalente Ventas
REF1, REF1B, 5
REF1, REF1C, 5
REF2, REF2B, 8
REF2, REF2C, 8
...

Disculpas por el ladrillo

Muchas gracias por anticipado.

Saludos.
  #2 (permalink)  
Antiguo 18/11/2014, 15:46
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta sql entre varias tablas

Código SQL:
Ver original
  1. Tabla ARTICULOS
  2. =====================
  3. CREATE TABLE #articulos(
  4. referencia VARCHAR(100),
  5. descripcion VARCHAR(100)
  6. )
  7. INSERT INTO #articulos VALUES ('REF1', 'DECRIPCION-REF1')
  8. INSERT INTO #articulos VALUES ('REF2', 'DECRIPCION-REF2')
  9. INSERT INTO #articulos VALUES ('REF3', 'DECRIPCION-REF3')
  10. INSERT INTO #articulos VALUES ('REF4', 'DECRIPCION-REF4')
  11. INSERT INTO #articulos VALUES ('REF1B', 'DECRIPCION-REF1B')
  12. INSERT INTO #articulos VALUES ('REF2B', 'DECRIPCION-REF2B')
  13. INSERT INTO #articulos VALUES ('REF3B', 'DECRIPCION-REF3B')
  14. INSERT INTO #articulos VALUES ('REF4B', 'DECRIPCION-REF4B')
  15.  
  16.  
  17. Tabla ESTADÍSTICAS
  18. =====================
  19. DROP TABLE #estadisticas
  20. CREATE TABLE #estadisticas
  21. (
  22. referencia VARCHAR(100),
  23. unidades INT,
  24. fecha VARCHAR(100)
  25. )
  26.  
  27. INSERT INTO #estadisticas VALUES ('REF1', 2 , '01/01/2014')
  28. INSERT INTO #estadisticas VALUES ('REF1', 3 , '10/01/2014')
  29. INSERT INTO #estadisticas VALUES ('REF2', 2 , '16/03/2014')
  30. INSERT INTO #estadisticas VALUES ('REF2', 6 , '21/04/2014')
  31. INSERT INTO #estadisticas VALUES ('REF3', 9 , '06/04/2014')
  32. INSERT INTO #estadisticas VALUES ('REF3', 1 , '12/05/2014')
  33. INSERT INTO #estadisticas VALUES ('REF4', 7 , '21/01/2014')
  34. INSERT INTO #estadisticas VALUES ('REF4', 5 , '10/03/2014')
  35. INSERT INTO #estadisticas VALUES ('REF1B', 2 , '06/05/2014')
  36. INSERT INTO #estadisticas VALUES ('REF2B', 2 , '23/03/2014')
  37. INSERT INTO #estadisticas VALUES ('REF3B', 2 , '17/05/2014')
  38.  
  39.  
  40. Tabla ARTICULOS EQUIVALENTES
  41. ============================
  42. CREATE TABLE #equivalencias(
  43. referencia1 VARCHAR(100),
  44. referencia2 VARCHAR(100)
  45. )
  46. INSERT INTO #equivalencias VALUES ('REF1','REF1B')
  47. INSERT INTO #equivalencias VALUES  ('REF1','REF1C')
  48. INSERT INTO #equivalencias VALUES  ('REF2','REF2B')
  49. INSERT INTO #equivalencias VALUES  ('REF2','REF2C')
  50. INSERT INTO #equivalencias VALUES  ('REF3','REF3B')
  51. INSERT INTO #equivalencias VALUES  ('REF3','REF3C')
  52. INSERT INTO #equivalencias  VALUES ('REF4','REF4B')
  53. INSERT INTO #equivalencias  VALUES ('REF4','REF4C')
  54.  
  55.  
  56.  
  57. SELECT referencia1, SUM(unidades) AS unidades FROM(
  58. SELECT referencia1, isnull(unidades,0) AS unidades FROM #estadisticas AS t1 RIGHT JOIN
  59. (
  60. SELECT referencia1 FROM #equivalencias
  61. UNION
  62. SELECT referencia2 FROM #equivalencias) AS t2 ON (t1.referencia=t2.referencia1)
  63. ) AS t3 GROUP BY referencia1

Resultado:

REF1 5
REF1B 2
REF1C 0
REF2 8
REF2B 2
REF2C 0
REF3 10
REF3B 2
REF3C 0
REF4 12
REF4B 0
REF4C 0

Nota: Si filtras por fecha, por ejemplo REF1C que fecha tendria??? la misma que su equivalente???
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 19/11/2014, 05:15
 
Fecha de Ingreso: febrero-2014
Ubicación: España
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Consulta sql entre varias tablas

Hola Libras!

Muchas gracias por responder y por tu ayuda.

Al ejecutar la consulta, me da un error de "Sintaxis incorrecta", he ido filtrando partes de la sql hasta que he visto que el error que da la base de datos que utilizo, está en la parte del sql que utiliza la tabla resultante de la UNION, para hacer el RIGHT JOIN en la línea del FROM #estadisticas, ...
He mirado la documentación de ésta bd y en concreto sobre la cláusula UNION, dice:
Cita:
El operador «UNION» no puede aparecer en un «subquery» ni en la definición de una «view»
Imagino que la cosa va por ahí. En fin, seguiré investigando a ver si puedo hacerlo de otra forma.

Te agradezco mucho la ayuda.
  #4 (permalink)  
Antiguo 19/11/2014, 08:31
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: Consulta sql entre varias tablas

la sentencia que envio es para MS SQL Server, seria que la adecuaras para usarla en tu DBMS
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 19/11/2014, 08:45
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: Consulta sql entre varias tablas

Cita:
Iniciado por Azor Ver Mensaje
Hola Libras!

Muchas gracias por responder y por tu ayuda.

Al ejecutar la consulta, me da un error de "Sintaxis incorrecta", he ido filtrando partes de la sql hasta que he visto que el error que da la base de datos que utilizo, está en la parte del sql que utiliza la tabla resultante de la UNION, para hacer el RIGHT JOIN en la línea del FROM #estadisticas, ...
He mirado la documentación de ésta bd y en concreto sobre la cláusula UNION, dice:


Imagino que la cosa va por ahí. En fin, seguiré investigando a ver si puedo hacerlo de otra forma.

Te agradezco mucho la ayuda.
¿Y cuál es, exactamente, el DBMS que usas?
Hay variaciones marcadas entre los diferentes, por lo cual debes ser más específico.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 19/11/2014, 09:44
 
Fecha de Ingreso: febrero-2014
Ubicación: España
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Consulta sql entre varias tablas

El dbms es CTSQL de MultiBase.
  #7 (permalink)  
Antiguo 19/11/2014, 10:02
 
Fecha de Ingreso: febrero-2014
Ubicación: España
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Consulta sql entre varias tablas

Cita:
Iniciado por Libras Ver Mensaje
la sentencia que envio es para MS SQL Server, seria que la adecuaras para usarla en tu DBMS
Si, es lo que intenté, pero acabé donde te cuento, con el error en el UNION.
  #8 (permalink)  
Antiguo 19/11/2014, 10:54
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: Consulta sql entre varias tablas

Cita:
Iniciado por Azor Ver Mensaje
El dbms es CTSQL de MultiBase.
Mi sugerencia es que te descargues el manual de SQL propio de ese DBMS y te atengas a lo que ese manual dice (http://www.base100.com/productos/pdf...ase/mb_sql.pdf)

Cada DBMS respeta el estandar SQL pero le agregan o quitan particularidades que los otros no tienen, o tienen de otra forma. Adicionalmente no poseen ni el mismo lenguaje procedural ni set de funciones propias, lo que complica migrar de uno a otro.
En tu problema específico, esa query es posible en Oracle, SQL Server, PosgreSQL y MySQL, por lo que la restriccion debe ser una particularidad del motor de MultiBase. Varias de las restricciones que he visto que menciona el manual no son validas en otros DBMS, pero excluirlas no viola el estandar meniconado.
DE hecho, MySQL admite comportamientos que no cumplen ningunos de los otros, pero tampoco violan el estandar. Noe s algo raro.

http://www.base100.com/productos/mb01.html

Si además lo estás haciendo desde Csomos, es una herramienta visual que accede a la base por medio de ODBC, que no suele ser un buen medio para usar sintaxis demasiado propietarias.
ODBC suele presentar problemas en cuanto te alejas del estandar ANSI-SQL.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #9 (permalink)  
Antiguo 19/11/2014, 17:17
 
Fecha de Ingreso: febrero-2014
Ubicación: España
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: Consulta sql entre varias tablas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Mi sugerencia es que te descargues el manual de SQL propio de ese DBMS y te atengas a lo que ese manual dice ([url]http://www.base100.com/productos/pdf/manuales/multibase/mb_sql.pdf[/url])

Cada DBMS respeta el estandar SQL pero le agregan o quitan particularidades que los otros no tienen, o tienen de otra forma. Adicionalmente no poseen ni el mismo lenguaje procedural ni set de funciones propias, lo que complica migrar de uno a otro.
En tu problema específico, esa query es posible en Oracle, SQL Server, PosgreSQL y MySQL, por lo que la restriccion debe ser una particularidad del motor de MultiBase. Varias de las restricciones que he visto que menciona el manual no son validas en otros DBMS, pero excluirlas no viola el estandar meniconado.
DE hecho, MySQL admite comportamientos que no cumplen ningunos de los otros, pero tampoco violan el estandar. Noe s algo raro.

[url]http://www.base100.com/productos/mb01.html[/url]

Si además lo estás haciendo desde Csomos, es una herramienta visual que accede a la base por medio de ODBC, que no suele ser un buen medio para usar sintaxis demasiado propietarias.
ODBC suele presentar problemas en cuanto te alejas del estandar ANSI-SQL.
Tengo descargado el manual de Multibase, de ahí saqué la conclusión del UNION. Seguiré buscando una alternativa que me permita adaptar el sql de Libras.

Yo no accedo a la base de datos desde cosmos, lo hago desde Java por JDBC. Lo hago así porque el ERP que tenemos no lo desarrollo yo sinó una empresa externa. Lo lógico sería que tubieramos una licencia de Multibase para poder desarrollar, pero por desgracia, no es posible, por lo que es habitual tener que generar consultas, informes o listados que el ERP no tiene. Entonces lo primero que hago es generar y probar el sql pertinente desde un pequeño editor de sql que tiene Multibase, luego es cuando desde java, creo el programa que obtendrá los datos de la bd.

He podido trabajar algún tiempo en Oracle y como dices ese sql es factible ejecutarlo, pero por desgracia en Multibase va a ser complicado.
Te agradezo la información y la ayuda, seguiré probando y si doy con la solución os lo comentaré.

Muchas gracias a los dos
Saludos.

Etiquetas: sql, tabla, tablas
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:56.