** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Unir consultas
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Tema cerradoUnir consultas

 Responder Responder Página  12>
Autor
Mensaje
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Tema: Unir consultas
    Enviado: 30/Julio/2018 a las 16:35
Buenas.
LLevo un tiempo intentando unir dos consultas en una sola, necesito que sea asi para utilizar una rutina de Mihura para no tener ni tablas ni consultas en access. He esperado a volver de vacaciones a ver si me venia la inspiracion, pero no...Confused

Las dos consultas son estas

1º llamada   Consulta2Cab

SELECT tbFicha.Fecha, tbFichaTrabajador.Categoria, tbFicha.Parque, Sum(tbDetallesFicha.[9Horas]) AS SumaDe9Horas, Count(tbFichaTrabajador.Observaciones) AS CuentaDeObservaciones
FROM (tbFicha INNER JOIN tbFichaTrabajador ON tbFicha.id = tbFichaTrabajador.IdDetalles) INNER JOIN tbDetallesFicha ON tbFichaTrabajador.Id = tbDetallesFicha.Id_tbFichaTrabajador
GROUP BY tbFicha.Fecha, tbFichaTrabajador.Categoria, tbFicha.Parque
HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) AND ((tbFichaTrabajador.Categoria) Like "Cab*"));



2º llamada  Consulta2MinCab

SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, tbFicha.Parque, tbFichaMinimos.Min9Horas
FROM tbFicha INNER JOIN tbFichaMinimos ON tbFicha.id = tbFichaMinimos.IdFicha
WHERE (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) AND ((tbFichaMinimos.Categoria) Like "Cab*"));




Ahora lo tengo asi, pero no puedo utilizar la rutina de Mihura para darle acceso a las tablas, utilizo las dos consultas anteriores, pero como veis en la sql no estan las tablas.

SELECT Consulta2MinCab.Parque, Consulta2MinCab.Min9Horas, Nz([SumaDe9Horas],0) AS 9h, IIf([9h]-[Min9Horas]=0,"OK",[9h]-[Min9Horas]) AS Res9, Consulta2Cab.CuentaDeObservaciones
FROM Consulta2Cab RIGHT JOIN Consulta2MinCab ON (Consulta2Cab.Parque = Consulta2MinCab.Parque) AND (Consulta2Cab.Fecha = Consulta2MinCab.Fecha)
ORDER BY Consulta2MinCab.Parque;



o tambien asi, utilizando la consulta Consulta2Cab, pero no tengo acceso a los nombres de las tablas para esta consulta

SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, tbFicha.Parque, IIf(Nz([SumaDe9Horas],0)-[Min9Horas]=0,"OK",Nz([SumaDe9Horas],0)-[Min9Horas]) AS Res, tbFichaMinimos.Min9Horas, Nz([SumaDe9Horas],0) AS 9
FROM (tbFichaMinimos LEFT JOIN tbFicha ON tbFichaMinimos.IdFicha = tbFicha.id) LEFT JOIN Consulta2Cab ON (tbFicha.Parque = Consulta2Cab.Parque) AND (tbFicha.Fecha = Consulta2Cab.Fecha)
GROUP BY tbFicha.Fecha, tbFichaMinimos.Categoria, tbFicha.Parque, tbFichaMinimos.Min9Horas, Nz([SumaDe9Horas],0)
HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) AND ((tbFichaMinimos.Categoria) Like "Cab*"));


A ver si se os ocurre algo para unirlas u otra solucion..... recordar que para que pueda utilizar la rutina de Mihura en la consulta final en la sql tienen que estar las tablas....


Saludos




Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10348
Enlace directo a este mensaje Enviado: 30/Julio/2018 a las 16:59
Esquemáticamente:

SQL1 = "SELECT tbFicha.Fecha, tbFichaTrabajador.Categoria ..... "
SQL2 = "SELECT tbFicha.Fecha, tbFichaMinimos.Categoria ...."

SQL = "SELECT .... " & _
          "FROM (" & SQL1 & ") AS T1" & _
          "LEFT JOIN (" & SQL2 & ") AS T2 ON T1.xxx = T2.xxx" & _
          "WHERE ...."

Una vez que te funcione ya aplicas el RT_RutaTabla a las tablas de la SQL1 y SQL2.

Por cierto, en vez de HAVING en las dos primeras consultas usa WHERE, es más rápido.


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 30/Julio/2018 a las 18:04
uhmmmm!!!  Ire probando.. lo de las 2 sql lo veo claro, pero el junntarlas no tanto. pero podrias ser algo asi??  donde esta en nombre de la consulta poner SQL1  o SQL2..

SELECT Consulta2MinCab.Parque, Consulta2MinCab.Min9Horas, Nz([SumaDe9Horas],0) AS 9h, IIf([9h]-[Min9Horas]=0,"OK",[9h]-[Min9Horas]) AS Res9, Consulta2Cab.CuentaDeObservaciones
FROM Consulta2Cab RIGHT JOIN Consulta2MinCab ON (Consulta2Cab.Parque = Consulta2MinCab.Parque) AND (Consulta2Cab.Fecha = Consulta2MinCab.Fecha)
ORDER BY Consulta2MinCab.Parque;
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10348
Enlace directo a este mensaje Enviado: 30/Julio/2018 a las 18:44
No, tanto SQL1 como SQL2 son un string ..  entiendo que lo estás haciendo en un entorno VBA, NO en el diseñador de consultas.

Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 31/Julio/2018 a las 00:34
Las consultas las obtengo desde la vista SQL, y las que son muy largas y no caben en una sola linea las hago con un complemento creo que de Chea. De hay van al entorno vba.
En tu ejemplo, el T1, T2 son tablas no?? No me acaba de quedar claro la estructurabde la consulta resultante.......
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10348
Enlace directo a este mensaje Enviado: 31/Julio/2018 a las 08:43
Es una consulta con subconsultas incluidas:

SELECT Campo1, Campo2
FROM (SELECT Campo1 FROM Mitabla1) AS T1
LEFT JOIN (SELECT Campo2 FROM Mitabla2) AS T2 ON T1.Id = T2.Id
WHERE ...


Al separarlo (lo que te pongo en el primer post) lo que hago es dejarmelo más claro a la hora de modificarla y simplificar el proceso de montaje y pruebas, ya que así puedes probar cada una por separado.

Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 17:21
Me esta costando bastante entender lo de las subconsultas

De momento voy asi, he armado las consultas necesarias, pero no veo como incluir stSQL1 que es la consulta Consulta2Cab en stSQL que es la que va en el recorsource.
Una ves funcione la Consulta2Cab en entorno vba  le pondre la rutina de Mihura.

Dim stSQL1 As String
Dim stSQL As String


'Esta es  Consulta2Cab 
stSQL1 = ""

stSQL1 = stSQL1 & " SELECT tbFicha.Fecha, tbFichaTrabajador.Categoria, "
stSQL1 = stSQL1 & "    tbFicha.Parque, Sum(tbDetallesFicha.[9Horas]) "
stSQL1 = stSQL1 & "    AS SumaDe9Horas, Count(tbFichaTrabajador.Observaciones) "
stSQL1 = stSQL1 & "    AS CuentaDeObservaciones"
stSQL1 = stSQL1 & " FROM (tbFicha"
stSQL1 = stSQL1 & " INNER JOIN tbFichaTrabajador"
stSQL1 = stSQL1 & " ON tbFicha.id = tbFichaTrabajador.IdDetalles)"
stSQL1 = stSQL1 & " INNER JOIN tbDetallesFicha"
stSQL1 = stSQL1 & " ON tbFichaTrabajador.Id = tbDetallesFicha.Id_tbFichaTrabajador"
stSQL1 = stSQL1 & " GROUP BY tbFicha.Fecha, tbFichaTrabajador.Categoria, "
stSQL1 = stSQL1 & "    tbFicha.Parque"
stSQL1 = stSQL1 & " HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL1 = stSQL1 & "    AND ((tbFichaTrabajador.Categoria) "
stSQL1 = stSQL1 & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "




stSQL = ""

stSQL = stSQL & " SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, IIf(Nz([SumaDe9Horas],0)-[Min9Horas]=0," & Chr(34) & "Ok" & Chr(34) & ",Nz([SumaDe9Horas],0)-[Min9Horas]) "
stSQL = stSQL & "    AS Res9, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0) AS 9h"
stSQL = stSQL & " FROM (" & RT_RutaTabla("tbFichaMinimos") & ""
stSQL = stSQL & " LEFT JOIN " & RT_RutaTabla("tbFicha") & ""
stSQL = stSQL & " ON tbFichaMinimos.IdFicha = tbFicha.id)"
stSQL = stSQL & " LEFT JOIN Consulta2Cab"
stSQL = stSQL & " ON (tbFicha.Parque = Consulta2Cab.Parque) "
stSQL = stSQL & "    AND (tbFicha.Fecha = Consulta2Cab.Fecha)"
stSQL = stSQL & " GROUP BY tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0)"
stSQL = stSQL & " HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL = stSQL & "    AND ((tbFichaMinimos.Categoria) "
stSQL = stSQL & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "

Me.RecordSource = stSQL



Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10348
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 17:57
stSQL = stSQL & " SELECT tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, IIf(Nz([SumaDe9Horas],0)-[Min9Horas]=0," & Chr(34) & "Ok" & Chr(34) & ",Nz([SumaDe9Horas],0)-[Min9Horas]) "
stSQL = stSQL & "    AS Res9, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0) AS 9h"
stSQL = stSQL & " FROM (" & RT_RutaTabla("tbFichaMinimos") & ""
stSQL = stSQL & " LEFT JOIN " & RT_RutaTabla("tbFicha") & ""
stSQL = stSQL & " ON tbFichaMinimos.IdFicha = tbFicha.id)"
stSQL = stSQL & " LEFT JOIN (" & stSQL1 & ") AS T1"
stSQL = stSQL & " ON (tbFicha.Parque = T1.Parque) "
stSQL = stSQL & "    AND (tbFicha.Fecha = T1.Fecha)"
stSQL = stSQL & " GROUP BY tbFicha.Fecha, tbFichaMinimos.Categoria, "
stSQL = stSQL & "    tbFicha.Parque, tbFichaMinimos.Min9Horas, "
stSQL = stSQL & "    Nz([SumaDe9Horas],0)"
stSQL = stSQL & " HAVING (((tbFicha.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL = stSQL & "    AND ((tbFichaMinimos.Categoria) "
stSQL = stSQL & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "
Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 18:34
Ahora si veo mas clara la estructura.
Pero me da error 3131, error en la clausula From

stSQL con Consulta2Cab funciona correctamente.......

Y la stSQL1 tambien, le he puesto un formulario con recordsource para probar  y correcto


Editado por rokoko - 02/Agosto/2018 a las 18:48
Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10348
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 19:46
Tendrás que mirar la calificación de los campos, porque repites las tablas en las dos consultas ... p.ej: T1.SumaHoras 


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 20:07
Publicado originalmente por Mihura Mihura escribió:

Tendrás que mirar la calificación de los campos, porque repites las tablas en las dos consultas ... p.ej: T1.SumaHoras 

Stern SmileStern Smile  Si, cada consulta lleva sus tablas. Me a sido imposible hacer una unica consulta con el generador de consultas, de hay que tenga que hacerlo apoyandome en una consulta extra.

No puede haber tablas o campos repetidos en SQL???

Entiendo que lo que estoy haciendo, es lo mismo que con una consulta normal pero en sql-vba. Se obtienen los datos de stSQL1 y luego con estos se obtiene los de stSQL

Ahora que parecia que empezaba a ver la luz jajaja

Arriba
Mihura Ver desplegable
Administrador
Administrador
Avatar

Unido: 06/Mayo/2005
Localización: España
Estado: Sin conexión
Puntos: 10348
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 20:12
Si tienes un campo fecha en más de una tabla tienes que calificarlo:

Tabla1.Fecha       Tabla2.Fecha


Si llamas a una tabla más de una vez en una consulta se usan los alias para diferenciarlas:

SELECT ... FROM Tabla AS T1
SELECT ... FROM Tabla AS T2

y sus campos:   T1.Fecha    T2.Fecha


Jesús Mansilla Castells.
Saludos desde Móstoles.

Access Aplicaciones
Tecsys.es
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 02/Agosto/2018 a las 20:32
El unico campo con el mismo nombre es Categoria, que esta en la tabla  tbFichaMinimos y tbFichaTrabajador, ya lo mirare mas relajadamente

SumaDe9Horas es el resultado de totales de Consulta2Cab.....uffffffWackoWacko
Arriba
pitxiku Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 27/Septiembre/2017
Localización: En mi casa
Estado: Sin conexión
Puntos: 632
Enlace directo a este mensaje Enviado: 05/Agosto/2018 a las 17:36
No se trata sólo de si hay 2 campos en tablas distintas que se llamen igual:

- Si la misma tabla la usas en las 2 consultas (o en subconsultas), tienes que usar alias para que Access sepa a cuál te estás refiriendo.

- Si está la misma tabla, habrá campos que aparezcan en varias consultas y subconsultas: tienes que usar/calificar la tabla o alias para que Access muestre/devuelva bien el dato.
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1407
Enlace directo a este mensaje Enviado: 06/Agosto/2018 a las 10:58
Buenas!!  no se ni cuantas pruebas he hecho ya.....esta es la ultima. A ver si veis el fallo, o es que no me estoy enterando de nadaConfused

Dim stSQL1 As String
Dim stSQL As String


'Esta es  Consulta2Cab, que va dentro de la stSQL
stSQL1 = ""

stSQL1 = stSQL1 & " SELECT T2.Fecha, T3.Categoria, "
stSQL1 = stSQL1 & "    T2.Parque, Sum(T4.[9Horas]) "
stSQL1 = stSQL1 & "    AS SumaDe9Horas, Count(T3.Observaciones) "
stSQL1 = stSQL1 & "    AS CuentaDeObservaciones"
stSQL1 = stSQL1 & " FROM (tbFicha AS T2"
stSQL1 = stSQL1 & " INNER JOIN tbFichaTrabajador AS T3"
stSQL1 = stSQL1 & " ON T2.id = T3.IdDetalles)"
stSQL1 = stSQL1 & " INNER JOIN tbDetallesFicha AS T4"
stSQL1 = stSQL1 & " ON T3.Id = T4.Id_tbFichaTrabajador"
stSQL1 = stSQL1 & " GROUP BY T2.Fecha, T3.Categoria, "
stSQL1 = stSQL1 & "    T2.Parque"
stSQL1 = stSQL1 & " HAVING (((T2.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL1 = stSQL1 & "    AND ((T3.Categoria) "
stSQL1 = stSQL1 & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "




stSQL = ""


stSQL = stSQL & " SELECT T6.Fecha, T5.Categoria, "
stSQL = stSQL & "    T6.Parque, IIf(Nz(T1.[SumaDe9Horas],0)-[Min9Horas]=0," & Chr(34) & "Ok" & Chr(34) & ",Nz(T1.[SumaDe9Horas],0)-[Min9Horas]) "
stSQL = stSQL & "    AS Res9, T5.Min9Horas, "
stSQL = stSQL & "    Nz([T1.SumaDe9Horas],0) AS 9h"
stSQL = stSQL & " FROM tbFichaMinimos AS T5"
stSQL = stSQL & " LEFT JOIN tbFicha AS T6"
stSQL = stSQL & " ON T5.IdFicha = T6.id)"
stSQL = stSQL & " LEFT JOIN (" & stSQL1 & ") AS T1"
stSQL = stSQL & " ON (T6.Parque = T1.Parque) "
stSQL = stSQL & "    AND (T6.Fecha = T1.Fecha)"
stSQL = stSQL & " GROUP BY T6.Fecha, T5.Categoria, "
stSQL = stSQL & "    T6.Parque, T5.Min9Horas, "
stSQL = stSQL & "    Nz([T1.SumaDe9Horas],0)"
stSQL = stSQL & " HAVING (((T5.Fecha)=[Formularios]![frmGestionOficial]![txtFecha]) "
stSQL = stSQL & "    AND ((T5.Categoria) "
stSQL = stSQL & "    Like " & Chr(34) & "Cab*" & Chr(34) & "));  "

Me.RecordSource = stSQL

Arriba
 Responder Responder Página  12>
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable