Problema con unión de dos consultas en access

A tod@s, llevo un tiempo con un problema al unir dos consultas en una tercera. El problema es que me aparecen los registros por duplicado. Para ser mas preciso, os envío información de las tablas:

Tengo por un lado la consulta PAGOS, cuyo resultado es el siguiente:

Apodo Fecha_Pago Por Mes Suma De Importe Pago

María diciembre 2013 300,00€

María noviembre 2013 300,00€

Cuyo código SQL es:

SELECT DISTINCTROW Pagos.Apodo, Format$([Pagos].[Fecha_Pago],'mmmm yyyy') AS [Fecha_Pago Por mes], Sum(Pagos.[Importe Pago]) AS [Suma De Importe Pago]
FROM Pagos
GROUP BY Pagos.Apodo, Format$([Pagos].[Fecha_Pago],'mmmm yyyy')
HAVING (((Pagos.Apodo)=[Introducir Apodo Monitora:]));

Por otro lado tengo la consulta SUELDOS, cuyo resultado es:

Apodo Fecha_Trabajo Por Mes Suma De Importe
María diciembre 2013 32,67€
María noviembre 2013 222,25€

María octubre 2013 0,00€

Con código SQL:

SELECT DISTINCTROW Horas.Apodo, Format$([Horas].[Fecha_Trabajo],'mmmm yyyy') AS [Fecha_Trabajo Por mes], Sum(Horas.Importe) AS [Suma De Importe]
FROM Horas
GROUP BY Horas.Apodo, Format$([Horas].[Fecha_Trabajo],'mmmm yyyy')
HAVING (((Horas.Apodo)=[Introducir Apodo Monitora:]));

Ambas consultas por separado, me dan los resultados de forma correcta, el problema es cuando intento hacer la unión, que me duplica los registros.

Sueldo_Apodo Mes_Sueldos Sueldos Pago_Apodo Mes_Pagos Pagos

María diciembre 2013 32,67€ María noviembre 2013 250,00€

María diciembre 2013 32,67€ María diciembre 2013 300,00€

María noviembre 2013 222,25€ María noviembre 2013 250,00€

María noviembre 2013 222,25€ María diciembre 2013 300,00€

El resultado que quiero conseguir es el siguiente:

Apodo Mes Sueldos Pagos

María diciembre 2013 32,67€ 300,00€

María noviembre 2013 222,25€ 250,00€

El código SQL que utilizo para hacer ésta tercera consulta es el siguiente:

SELECT DISTINCTROW [Consulta Sueldo Mensual Por Nombre].Apodo AS Sueldo_Apodo, [Consulta Sueldo Mensual Por Nombre].[Fecha_Trabajo Por Mes] AS Mes_Sueldos, [Consulta Sueldo Mensual Por Nombre].[Suma De Importe] AS Sueldos, [Consulta Pago Mensual Por Nombre].Apodo AS Pago_Apodo, [Consulta Pago Mensual Por Nombre].[Fecha_Pago Por Mes] AS Mes_Pagos, [Consulta Pago Mensual Por Nombre].[Suma De Importe Pago] AS Pagos
FROM (Monitoras INNER JOIN [Consulta Pago Mensual Por Nombre] ON Monitoras.[Apodo] = [Consulta Pago Mensual Por Nombre].[Apodo]) INNER JOIN [Consulta Sueldo Mensual Por Nombre] ON Monitoras.[Apodo] = [Consulta Sueldo Mensual Por Nombre].[Apodo]
ORDER BY [Consulta Sueldo Mensual Por Nombre].[Fecha_Trabajo Por Mes];

Llevo una semana intentándolo sin éxito, así como viendo foros y páginas web especializadas, por lo que os pido a ver si me podéis echar una mano.

1 respuesta

Respuesta
1

Puedes probar la siguiente:

SELECT DISTINCT [Consulta Sueldo Mensual Por Nombre].Apodo AS Sueldo_Apodo, [Consulta Sueldo Mensual Por Nombre].[Fecha_Trabajo Por Mes] AS Mes_Sueldos, [Consulta Sueldo Mensual Por Nombre].[Suma De Importe] AS Sueldos, [Consulta Pago Mensual Por Nombre].Apodo AS Pago_Apodo, [Consulta Pago Mensual Por Nombre].[Fecha_Pago Por Mes] AS Mes_Pagos, [Consulta Pago Mensual Por Nombre].[Suma De Importe Pago] AS Pagos
FROM (Monitoras INNER JOIN [Consulta Pago Mensual Por Nombre] ON Monitoras.[Apodo] = [Consulta Pago Mensual Por Nombre].[Apodo]) INNER JOIN [Consulta Sueldo Mensual Por Nombre] ON Monitoras.[Apodo] = [Consulta Sueldo Mensual Por Nombre].[Apodo]
ORDER BY [Consulta Sueldo Mensual Por Nombre].[Fecha_Trabajo Por Mes];

De todas formas, voy a ver si puedo hacer algo que no sea tan engorroso, que no dependa de tantas consultas y tan complejas, y te lo digo.

Ya tengo tu respuesta. He tenido que cambiar un nombre de campo, ya que me daba errores, es el campo Importe Pago, lo he tenido que cambiar a Importe_Pago.

Te he montado 2 consultas juntas en una sola:

SELECT Apodo, Format([Fecha_Trabajo],"mmmm YYYY") AS Mes, Sum(Importe) AS SumaDeImporte, Sum(Pago) AS SumaDePago
FROM (SELECT Apodo, Fecha_Trabajo, Importe, 0 as Pago
FROM Horas
UNION ALL SELECT Apodo, Fecha_Pago, 0 as Importe, Importe_Pago
FROM Pagos) As QryDatosJuntos
GROUP BY Apodo, Format([Fecha_Trabajo],"mmmm YYYY"), Format([Fecha_Trabajo],"YYYYmm")

HAVING (((QryDatosJuntos.Apodo)=[Introducir Apodo Monitora:]))
ORDER BY Format([Fecha_Trabajo],"YYYYmm")

Con esto tienes lo que buscas, los importes sumados, agrupados por Monitor y mes.

En esta parte, seleccionamos los datos que vamos a tener:

SELECT Apodo, Format([Fecha_Trabajo],"mmmm YYYY") AS Mes, Sum(Importe) ASSumaDeImporte, Sum(Pago) AS SumaDePago.

FROM (

Como puedes ver, al final de todo es donde hacemos las sumas.

Aquí es donde selecciono las dos tablas implicadas, realizando una consulta de unión

SELECT Apodo, Fecha_Trabajo, Importe, 0 as Pago
FROM Horas
UNION ALL SELECT Apodo, Fecha_Pago, 0, Importe_Pago
FROM Pagos

Y le asigno un Alias

) As QryDatosJuntos

Montamos las agrupaciones...

GROUP BY Apodo, Format([Fecha_Trabajo],"mmmm YYYY"), Format([Fecha_Trabajo],"YYYYmm")

...Y mantenemos la selección de Monitora...

HAVING (((QryDatosJuntos.Apodo)=[Introducir Apodo Monitora:]))

Finalmente agregamos esto para que salgan ordenados por año y mes (que no se visualiza).
ORDER BY Format([Fecha_Trabajo],"YYYYmm")

Ante todo muchas gracias a los dos por la pronta respuesta.

La primera respuesta me sigue dando el mismo resultado, con los registros duplicados. En cuanto a la segunda respuesta ya se va acercando a lo que necesito, sin embargo al ejecutar la consulta me solicitaba un valor para Importe_Pago, cosa que he arreglado introduciento 0 AS Importe_Pago. Otro problema es que la columna SumaDePago me sale valor cero

Apodo Mes SumaDelImporte SumaDePago
María diciembre 2013 32,67€ 0,00€
María noviembre 2013 222,25€ 0,00€

Al principio de mi respuesta te puse que había tenido que cambiar el nombre del campo.

"He tenido que cambiar un nombre de campo, ya que me daba errores, es el campo Importe Pago, lo he tenido que cambiar a Importe_Pago."


No es bueno utilizar nombres con espacios, ni excesivamente largos, pues pueden dar lugar a problemas y /o errores, por ese motivo había cambiado el nombre en la tabla, pero no hay problema, te pongo el que utilizas tú.

Te pongo la consulta con el nombre de campo que utilizas.

SELECT Apodo, Format([Fecha_Trabajo],"mmmm YYYY") AS Mes, Sum(Importe) AS SumaDeImporte, Sum(Pago) AS SumaDePago
FROM (SELECT Apodo, Fecha_Trabajo, Importe, 0 as Pago
FROM Horas
UNION ALL SELECT Apodo, Fecha_Pago, 0 as Importe, [Importe Pago]
FROM Pagos) As QryDatosJuntos
GROUP BY Apodo, Format([Fecha_Trabajo],"mmmm YYYY"), Format([Fecha_Trabajo],"YYYYmm")
HAVING (((QryDatosJuntos.Apodo)=[Introducir Apodo Monitora:]))
ORDER BY Format([Fecha_Trabajo],"YYYYmm")

Crea una consulta nueva y te vas a la opción SQL, pega lo que te he puesto y ya lo tienes.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas