MySQL - Problema consulta INNER JOIN Group BY

 
Vista:

Problema consulta INNER JOIN Group BY

Publicado por iosu (3 intervenciones) el 15/01/2019 10:39:36
A ver como os lo cuento...

Tengo dos tablas (Agenda, Pagos). Su estructura es la siguiente:

Agenda
ID
Fecha
Importe
Pagado

Pagos
ID
ID_Agenda
Fecha
Importe

En la Agenda se anotan citas de una consulta de masajes y el precio que cuesta dicha cita. El pago de dicha cita se anota en Pagos ya que como se puede pagar en varias remesas, estas quedan registradas independientemente. Una vez de que todo el importe de la cita se ha abonado el campo Pagado se pone en verdadero.

Me gustaría hacer una consulta/búsqueda de todas la citas de la agenda cuyo campo Pagado sea falso y que contenga la suma de los importes de la tabla Pagos para mostrar el importe de la cita y lo pagado por esa cita para ver lo que falta de pagar.

El problema es que puede haber citas sin pagar y no existe ningún registro en Pagos. Entonces la consulta no muestra las citas que no tienen ningún pago.

mi consulta es esta:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
`Agenda`.`ID`,
`Agenda`.`Importe`,
`Agenda`.`Pagado`,
`Pagos`.`ID_Agenda`,
SUM(`Pagos`.`Importe`) AS `Importe_0`
FROM
`Agenda`
JOIN `Pagos`
ON `Agenda`.`ID` = `Pagos`.`ID_Agenda`
WHERE
`Agenda`.`Pagado`=0
GROUP BY
`Pagos`.`ID_Agenda`


Alguna sugerencia para que muestre las citas cuyo campo Pagado sea falso y la suma de los pagos no cubra el importe de las citas aunque no exista ningún pago? Esto es, que muestre también las citas que no tengan ningún pago

Muchas gracias...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 98
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Problema consulta INNER JOIN Group BY

Publicado por kip (30 intervenciones) el 15/01/2019 12:20:15
Hola, lo que necesitas usar es LEFT JOIN para que te muestre los registros en `Agenda` cuyo `ID` no exista en `Pagos`, es decir que no haya una FK en `Pagos` apuntando a la PK de `Agenda`.

Si necesitas algun ejemplo, comentanos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema consulta INNER JOIN Group BY

Publicado por iosu (3 intervenciones) el 15/01/2019 12:38:37
Gracias por la respuesta:


así?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
`Agenda`.`ID`,
`Agenda`.`Importe`,
`Agenda`.`Pagado`,
`Pagos`.`ID_Agenda`,
SUM(`Pagos`.`Importe`) AS `Importe_0`
FROM
`Agenda`
LEFT JOIN `Pagos`
ON `Agenda`.`ID` = `Pagos`.`ID_Agenda`
WHERE
`Agenda`.`Pagado`=0
GROUP BY
`Pagos`.`ID_Agenda`

Me da un error:

"Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'prueba.Agenda.ID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Problema consulta INNER JOIN Group BY

Publicado por iosu (3 intervenciones) el 15/01/2019 13:04:29
lo he MEDIO solucionado así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
ANY_VALUE(`Agenda`.`ID`),
ANY_VALUE(`Agenda`.`Importe`),
ANY_VALUE(`Agenda`.`Pagado`),
ANY_VALUE(`Pagos`.`ID_Agenda`),
ANY_VALUE(SUM(`Pagos`.`Importe`)) AS `Importe_0`
FROM
`Agenda`
LEFT JOIN `Pagos`
ON `Agenda`.`ID` = `Pagos`.`ID_Agenda`
WHERE
`Agenda`.`Pagado`=0
GROUP BY
`Pagos`.`ID_Agenda`

Que os parece?

muchas gracias por todo...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de kip
Val: 98
Bronce
Ha mantenido su posición en MySQL (en relación al último mes)
Gráfica de MySQL

Problema consulta INNER JOIN Group BY

Publicado por kip (30 intervenciones) el 15/01/2019 14:16:11
El error que te aparecía se debe a la restriccion del modo "only_full_group_by" configurablr en my.cnf o en tiempo de ejecución modificando la variable SQL_MODE.

La solución que tienes es correcta pero no del todo, la funcion ANY_VALUE(función de conjunto) lo que hace es traerte cualquier valor y esta es una de las funciones que van de la mano cuando se usa GROUP_BY, pero solo es aplicable en las columnas que no forman parte de la agrupación, en tu caso `Pagos`.`ID_Agenda` no es necesaria colocarla con ANY_VALUE, las columnas que usen las funciones de conjuntos como SUM, MAX o MIN tampoco son necesarias colocarlas de esa forma.

Si los registros en Agenda siempre se manejan por la PK, creo que tu solución es perfecta, ya que ANY_VALUE siempre retornara un solo valor (únicamente dentro de los registros de Agenda).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar