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

Duda con Consulta SQL

Estas en el tema de Duda con Consulta SQL en el foro de Mysql en Foros del Web. Hola!, Tengo algo que me esta rompiendo la cabeza.. Tengo una tabla con pagos de usuarios: id_user_paid id_user user_paid paid_date 1 9 0.00 2011-12-20 2 ...
  #1 (permalink)  
Antiguo 20/12/2011, 00:02
 
Fecha de Ingreso: julio-2009
Mensajes: 29
Antigüedad: 14 años, 8 meses
Puntos: 0
Duda con Consulta SQL

Hola!,
Tengo algo que me esta rompiendo la cabeza..
Tengo una tabla con pagos de usuarios:

id_user_paid id_user user_paid paid_date
1 9 0.00 2011-12-20
2 8 1.00 2011-12-20

y la siguiente consulta:

SELECT users_data.num_doc, CONCAT(users_data.last_name, ', ', users_data.first_name) AS nombre,
CONCAT('$', ROUND( (training.training_cost - (training.training_cost * payment_plans.payment_plan_discount / 100)),2)) AS tot_a_pagar,
CONCAT('$', ROUND( SUM(users_payment.user_paid), 2)) AS tot_pagado,
CONCAT('$', ROUND( (training.training_cost - (training.training_cost * payment_plans.payment_plan_discount / 100)) - (SUM(users_payment.user_paid)),2)) AS saldo,
MAX(users_payment.paid_date) AS ultimo_pago
FROM users_data
JOIN users_payment ON users_data.id_user = users_payment.id_user
JOIN users_payment_plans ON users_data.id_user = users_payment_plans.id_user
JOIN payment_plans ON users_payment_plans.payment_plan_id = users_payment_plans.payment_plan_id
JOIN users_trainings ON users_data.id_user = users_trainings.id_user
JOIN training ON users_trainings.id_training = training.training_id
GROUP BY users_data.num_doc

el campo tot_pagado tendria que ser 1,00 pero me sale 4,00..
Porque puede ser?
  #2 (permalink)  
Antiguo 20/12/2011, 02:11
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Duda con Consulta SQL

Pon ejemplos de los datos de todas las tablas... sin ver nada solo se puede decir que alguna relacion te esta generando que ese valor se lea 4 veces....

GROUP BY users_data.num_doc, CONCAT(users_data.last_name, ', ', users_data.first_name)

para ser estrictos te falta esto en el group by.... ¿puede ser que tengas users con el mismo num_doc y nombres distintos?
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 20/12/2011, 16:57
 
Fecha de Ingreso: julio-2009
Mensajes: 29
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Duda con Consulta SQL

Hola!, gracias por la respuesta.
para prueba solo tengo 2 usuarios, cada uno con un dni y un nombre.

como decis probe con:
GROUP BY users_data.id_user, CONCAT(users_data.last_name, ', ', users_data.first_name)
y no da el numero que deberia dar..

Tabla users_data:
id_user | first_name | last_name | birth_place | birth_date | id_type_doc | num_doc
8 | Ezequiel | Rodriguez | NULL | 1983-11-16 | 1 | 33333333
9 | Ignacio | Perez | NULL | 1978-02-14 | 1 | 22222222

Tabla users_payment:
id_user_paid | id_user | user_paid | paid_date
1 | 9 | 0.00 | 2011-12-20
2 | 8 | 1.00 | 2011-12-20
2 | 8 | 15.00 | 2011-12-20

Tabla users_payment_plans:
id_user_payment_plan | id_user | payment_plan_id
2 | 8 | 1
3 | 9 | 1

Tabla payment_plans:
payment_plan_id | payment_plan_cod | payment_plan_name | payment_plan_discount
1 | A | Débito directo de caja de ahorro o cuenta corrient... | 10

Tabla users_trainings:
id_user_training | id_user | id_training | pre_inscription_date | activate_date
1 | 8 | 1 | 2011-12-18 | 2011-12-18
2 | 9 | 1 | 2011-12-18 | 2011-12-18

Tabla training:
training_id | created_date | training_name | duration | enrollment | training_cost
1 | 2011-12-18 | Desarrollo Y Constitución Subjetiva En Tiempo De ... | 9 | 400 | 2520

El resultado de la consulta:
33333333 | Rodriguez, Ezequiel | $2268.00 | $65.00 | $2203.00 | 2011-12-20
22222222 | Perez, Ignacio | $2268.00 | $0.00 | $2268.00 | 2011-12-20

Espero haberme explicado.. el total pagado deberia ser $16.00 y no $65.00 como dice, no se que estoy haciendo mal.
  #4 (permalink)  
Antiguo 20/12/2011, 19:43
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: Duda con Consulta SQL

Es un problema que se produce cuando se usan funciones agrupadas sobre diferentes columnas provenientes de diferentes tablas en un JOIN multitabla. En realidad lo que sucede es que realiza los JOIN antes de hacer la operación de la función, y como la cardinalidad es superior a 1, genera un producto cartesiano no previsto, antes de hacer la el agrupamiento.
La única solución es hacer que las diferentes tablas de datos se consoliden antes de usarlas en un JOIN, de modo que cuando este se haga la relación tenga cardinalidad 1 en todos los casos.
Hace unos días alguien preguntó por un caso similar, sólo que era con tres tablas, nada más.
La idea sería mas o menos:
Código MySQL:
Ver original
  1.     UD.num_doc,
  2.     CONCAT(UD.last_name, ', ', UD.first_name) nombre,
  3.     CONCAT('$', ROUND((T.training_cost - (T.training_cost * PP.payment_plan_discount/100)),2)) tot_a_pagar,
  4.     CONCAT('$', ROUND(UP.user_paid, 2)) tot_pagado,
  5.     CONCAT('$', ROUND((T.training_cost - (T.training_cost * PP.payment_plan_discount / 100)) - (UP.user_paid),2)) saldo,
  6.     UP.paid_date ultimo_pago
  7.     users_data UD
  8.     INNER JOIN
  9.         (SELECT MAX(paid_date), SUM(user_paid) user_paid, id_user, paid_date
  10.         FROM users_payment
  11.         GROUP BY id_user) UP
  12.         ON UD.id_user = UP.id_user
  13.     INNER JOIN users_payment_plans UPP
  14.         ON UD.id_user = UPP.id_user
  15.     INNER JOIN payment_plans PP
  16.         ON UPP.payment_plan_id = PP.payment_plan_id
  17.     INNER JOIN users_trainings UT
  18.         ON UD.id_user = UT.id_user
  19.     INNER JOIN training T
  20.         ON UT.id_training = T.training_id
  21. GROUP BY UD.num_doc

Por cierto: Trata de usar ALIAS para simplificar la sintaxis, y procura no usar JOIN sólo. Define mejor la operación para que el parser utilice el algoritmo más eficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 20/12/2011, 20:00
 
Fecha de Ingreso: julio-2009
Mensajes: 29
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Duda con Consulta SQL

Gracias quimfv y gnzsoloyo!, creo haber entendido lo que me decis gnzsoloyo
ya me acostumbraré a los alias.. jaja.

Muchas gracias a los 2!
Slds.

Eze.

Etiquetas: query, sql
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 03:14.