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

Sumatoria de un valor

Estas en el tema de Sumatoria de un valor en el foro de Mysql en Foros del Web. Hola, en primer lugar decir que soy muy novato (por si comento algún error grave). Tengo una pregunta que os puede ser fácil pero no ...
  #1 (permalink)  
Antiguo 22/02/2017, 12:37
 
Fecha de Ingreso: octubre-2008
Mensajes: 91
Antigüedad: 11 años, 1 mes
Puntos: 0
Sumatoria de un valor

Hola, en primer lugar decir que soy muy novato (por si comento algún error grave). Tengo una pregunta que os puede ser fácil pero no soy capaz de sacar una consulta óptima.

Mi pregunta va relacionada con dos tablas:

Campañas: Tiene un ID y Nombre
Horas:Se usa para añadir horas a una campaña dado un id.

El caso es que quiero sacar un listado de las campañas y que me saque el total de las horas. Ahora mismo lo he dividido en dos consultas:

1) select id, nombre from campañas
2) Para cada ID anterior: select sum(tiempo) from horas where id_campaña='ID'

Esto provoca que mi consulta tarde mucho, porque por cada campaña itera sobre la tabla de horas para sumar el tiempo total.

¿Cómo podría hacerlo más eficiente?

Muchas gracias por adelantado,
Un saludo
  #2 (permalink)  
Antiguo 22/02/2017, 12:45
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.406
Antigüedad: 13 años, 3 meses
Puntos: 774
Respuesta: Sumatoria de un valor

y porque no una sola consulta con un join?

Código MySQL:
Ver original
  1. select sum(tiempo) as total, campaña from campaña as t1
  2. inner join horas as t2 on (t1.id=t2.id_campaña)
  3. group by campaña
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 22/02/2017, 13:30
 
Fecha de Ingreso: octubre-2008
Mensajes: 91
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Sumatoria de un valor

Cita:
Iniciado por Libras Ver Mensaje
y porque no una sola consulta con un join?

Código MySQL:
Ver original
  1. select sum(tiempo) as total, campaña from campaña as t1
  2. inner join horas as t2 on (t1.id=t2.id_campaña)
  3. group by campaña
Muchas gracias por tu respuesta,

He intentado hacer lo que me comentas pero no termina de funcionar bien. te explico, en verdad hay más de una relación entre tablas, ya que tengo:
- Campañas
- Clientes
- Horas
- Equipo

Por tanto habría mas de un INNER JOIN entiendo, no?


El caso es que he puesto lo que me comentas y de 180 campañas solo me esta sacando un resultado de 32. ¿a que puede ser debido?
  #4 (permalink)  
Antiguo 22/02/2017, 14:53
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.406
Antigüedad: 13 años, 3 meses
Puntos: 774
Respuesta: Sumatoria de un valor

No, no habria mas de un inner join, habria mas campos en el ON, ademas de que agregarias mas campos en el group by

Código SQL:
Ver original
  1. SELECT SUM(tiempo) AS total, campaña, cliente FROM campaña AS t1
  2. INNER JOIN horas AS t2 ON (t1.id=t2.id_campaña AND t1.cliente=t2.id_cliente.......)
  3. GROUP BY campaña,cliente
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #5 (permalink)  
Antiguo 22/02/2017, 16:14
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 12 años, 10 meses
Puntos: 447
Respuesta: Sumatoria de un valor

Hola nitsuga1986:

Cita:
He intentado hacer lo que me comentas pero no termina de funcionar bien. te explico, en verdad hay más de una relación entre tablas, ya que tengo:
- Campañas
- Clientes
- Horas
- Equipo

Por tanto habría mas de un INNER JOIN entiendo, no?
Si estoy en lo correcto estamos entonces hablando de cuatro tablas, si es así entonces es correcto que haya más de un JOIN, ahora bien, el INNER JOIN tiene una relación incluyente, ¿qué quiere decir esto? que debe existir al menos un registro en ambas tablas para que se haga la relación.

Cita:
El caso es que he puesto lo que me comentas y de 180 campañas solo me esta sacando un resultado de 32. ¿a que puede ser debido?
Esto es justamente por lo que te comento, si hay 180 campañas entonces debe haber al menos un registro en cada una de las tablas para que aparezcan en la relación.

supongamos el siguiente ejemplo a modo de ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +----+-------------+
  3. | id | descripcion |
  4. +----+-------------+
  5. |   1| uno         |
  6. +----+-------------+
  7. |   2| dos         |
  8. +----+-------------+
  9. |   3| tres        |
  10. +----+-------------+
  11. 3 rows in set (0.00 sec)
  12.  
  13. mysql> SELECT * FROM tabla2;
  14. +----+-------------+
  15. | id | descripcion |
  16. +----+-------------+
  17. |   1| one         |
  18. +----+-------------+
  19. |   3| three       |
  20. +----+-------------+
  21. 3 rows in set (0.00 sec)

Si utilizas un INNER JOIN, el id = 2 de la tabla1 NO APARECERÁ EN EL LISTADO, debido a que no existe en la tabla2. para estos casos puedes utilziar un LEFT o un RIGTH JOIN.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2.     -> INNER JOIN tabla2 On tabla1.id = tabla2.id
  3. +----+-------------+----+-------------+
  4. | id | descripcion | id | descripcion |
  5. +----+-------------+----+-------------+
  6. |   1| uno         |   1| one         |
  7. +----+-------------+----+-------------+
  8. |   3| tres        |   3| three       |
  9. +----+-------------+----+-------------+
  10. 2 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tabla1;
  13.     -> LEFT JOIN tabla2 On tabla1.id = tabla2.id
  14. +----+-------------+----+-------------+
  15. | id | descripcion | id | descripcion |
  16. +----+-------------+----+-------------+
  17. |   1| uno         |   1| one         |
  18. +----+-------------+----+-------------+
  19. |   2| dos         |null| null        |
  20. +----+-------------+----+-------------+
  21. |   3| tres        |   3| three       |
  22. +----+-------------+----+-------------+
  23. 3 rows in set (0.00 sec)

Saludos
Leo
  #6 (permalink)  
Antiguo 23/02/2017, 02:26
 
Fecha de Ingreso: octubre-2008
Mensajes: 91
Antigüedad: 11 años, 1 mes
Puntos: 0
Respuesta: Sumatoria de un valor

Muchisimas gracias!

Maravillosa y super clara explicación !!

Un saludo

Etiquetas: select, sumatoria, tabla, valor
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 07:43.