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

agrupar por mes de 2 tablas diferentes..URGENTE

Estas en el tema de agrupar por mes de 2 tablas diferentes..URGENTE en el foro de Bases de Datos General en Foros del Web. les agradeceria si me pueden ayudar con eso, llevo tiempo con ello y no hay manera de sacarlo. la consulta consistiria en sacar el numero ...
  #1 (permalink)  
Antiguo 23/10/2008, 03:46
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 16 años, 6 meses
Puntos: 1
agrupar por mes de 2 tablas diferentes..URGENTE

les agradeceria si me pueden ayudar con eso, llevo tiempo con ello y no hay manera de sacarlo.

la consulta consistiria en sacar el numero de registros con un count de una primera tabla agrupados por fecha(mes), pero la complicacion esta que tengo que hacer lo mismo pero de otra tabla y que me salga todo agrupado por los meses, me explico:

primera tabla:

empresa_id producto_id fecha_compra
--------------- -------------- ------------------

segunda tabla:

empresa_id id_empleado feha_alta
-------------- ---------------- -------------

ahora necesito agrupar el numero de empleados que se han dado de alta para un determinado mes y otro campo con el numero de productos contratados..

y que me salga de esta forma por ejemplo

mes numero_empleados numero_productos
------ ---------------------------------------------------
enero 4 2


muchas gracias
  #2 (permalink)  
Antiguo 23/10/2008, 15:28
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 17 años
Puntos: 300
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

Crea una tabla dentro de esa base llamada meses con dos campos, id y mes. El id será el número del mes y el mes su nombre.
id mes
1 enero
2 febrero
3 marzo

etc.

Luego lanza esta consulta
SELECT m.mes AS MES, IFNULL( t2.totalaltas, 0 ) num_usuarios, IFNULL( t1.totalproductos, 0 ) num_productos
FROM meses m
LEFT JOIN (

SELECT month( p.fecha_compra ) AS id, count( p.idproducto ) AS totalproductos
FROM producto p
GROUP BY month( p.fecha_compra )
)t1 ON m.id = t1.id
LEFT JOIN (

SELECT month( u.fecha_alta ) AS id, count( u.id_usuario ) AS totalaltas
FROM usuarios u
GROUP BY month( u.fecha_alta )
)t2 ON m.id = t2.id

Ya nos dirás.

Podrías hacerlo sin tener que crear la tabla meses, pero sería más complejo.
  #3 (permalink)  
Antiguo 24/10/2008, 00:32
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

Gracias por tu respuesta Jurena!!

el problema es que no puedo crear ninguna tabla mas en la base de datos, necesito generar un informe con la base que me pasan..

las 2 tablas se pueden relacionar con el campo de id_empresa que tienen en comun, pero eso no resuelve el problema, luego hay otro problema debo diferenciar entre enero 2007, y enero 2008 por ejemplo..

no se si habra alguna forma de hacerlo,

un saludo
  #4 (permalink)  
Antiguo 24/10/2008, 01:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 17 años
Puntos: 300
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

Formas siempre hay, pero mi pregunta ahora es cuál es el rango de fechas; ¿es un rango amplio y abierto? ¿se trata de los últimos dos años?

Y ahora la pregunta más importante: ¿Tienes que hacerlo sólo en la base de datos? Esto, probablemente, lo resolverás mejor con la ayuda de programación.
  #5 (permalink)  
Antiguo 24/10/2008, 02:17
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

Efectivamente el rango es abierto, puede ir de un mes a años, y fuera de la consulta tampoco el entorno me ofrece muchas posibilidades, estoy utilizando el ireport que limita bastante..
  #6 (permalink)  
Antiguo 24/10/2008, 03:27
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 17 años
Puntos: 300
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

Si no te importara que sólo mostrase el año y mes para el que hay datos, el problema sería posible resolverlo directamente en la base; pero si quieres la secuencia de años y meses en que ni uno ni otro, todo ello con los ceros, lo mejor sería que lo hicieras con programación. Pero quiero hacerte una aclaración: no sé si con un store procedure se podría hacer algo al respecto, porque yo no trabajo con ellos.
  #7 (permalink)  
Antiguo 24/10/2008, 03:54
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

no es la mejor solucion, pero me sirve si se puede sacar solo cuando hay datos, si me puedes decir como..

gracias por tu tiempo
  #8 (permalink)  
Antiguo 26/10/2008, 06:04
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 17 años
Puntos: 300
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

Como no trabajo con Store Procedures, te hago una propuesta con la creación de una tabla temporal. Yo trabajo en MysQL y si lanzas esto:
Código sql:
Ver original
  1. CREATE TEMPORARY TABLE tmp engine = memory SELECT YEAR(fecha_compra) año, MONTH(fecha_compra) mes FROM producto UNION DISTINCT SELECT YEAR(fecha_alta), MONTH(fecha_alta) FROM usuarios ORDER BY año, mes;
  2. SELECT * FROM tmp;
  3.  
  4. SELECT tmp.año,
  5. CASE WHEN tmp.mes =1
  6. THEN "enero"
  7. WHEN tmp.mes =2
  8. THEN "febrero"
  9. WHEN tmp.mes =3
  10. THEN "marzo"
  11. WHEN tmp.mes =4
  12. THEN "abril"
  13. WHEN tmp.mes =5
  14. THEN "mayo"
  15. WHEN tmp.mes =6
  16. THEN "junio"
  17. WHEN tmp.mes =7
  18. THEN "julio"
  19. WHEN tmp.mes =8
  20. THEN "agosto"
  21. WHEN tmp.mes =9
  22. THEN "septiembre"
  23. WHEN tmp.mes =10
  24. THEN "octubre"
  25. WHEN tmp.mes =11
  26. THEN "noviembre"
  27. WHEN tmp.mes =12
  28. THEN "diciembre"
  29. ELSE "esto no es un mes"
  30. END AS mes, IFNULL( t1.totalp, 0 ) AS compras, IFNULL( t2.totalus, 0 ) AS altas
  31. FROM tmp
  32. LEFT JOIN (
  33.  
  34. SELECT YEAR( fecha_compra ) anyo, MONTH( fecha_compra ) mes, COUNT( * ) totalp
  35. FROM producto
  36. GROUP BY YEAR( fecha_compra ) , MONTH( fecha_compra )
  37. )t1 ON tmp.año = t1.anyo
  38. AND tmp.mes = t1.mes
  39. LEFT JOIN (
  40.  
  41. SELECT YEAR( fecha_alta ) anyo, MONTH( fecha_alta ) mes, COUNT( * ) totalus
  42. FROM usuarios
  43. GROUP BY YEAR( fecha_alta ) , MONTH( fecha_alta )
  44. )t2 ON tmp.año = t2.anyo
  45. AND tmp.mes = t2.mes
  46. ORDER BY tmp.año, tmp.mes

A mí me ha funcionado en un MySQL 5.0. Creo una tabla temporal que cargo con los datos de año y mes de las otras tablas, con union distinct para evitar las repeticiones de meses; luego hago mediante left join las uniones.
Respecto a lo otro, es decir, a que aparecieran todos los meses, insisto en que tendrías que hacerlo con programación.
  #9 (permalink)  
Antiguo 27/10/2008, 01:49
 
Fecha de Ingreso: agosto-2008
Mensajes: 14
Antigüedad: 16 años, 6 meses
Puntos: 1
Respuesta: agrupar por mes de 2 tablas diferentes..URGENTE

hola!

estoy trabajando con ireport, y parece que lo de la tabla temporal no lo acepta, asi que voy a probar con store procedure que has mencionado antes..

me has sido de gran ayuda, muchas gracias por tus resouestas..

un saludo
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 16:59.