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

Agrupar registros por mes

Estas en el tema de Agrupar registros por mes en el foro de Bases de Datos General en Foros del Web. Buenas a todos!! Tengo un a duda de SQL, a ver si me pueden echar una mano.. Estoy intentado hacer una consulta para contar los ...
  #1 (permalink)  
Antiguo 27/10/2009, 01:52
Avatar de huspy  
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 15 años, 4 meses
Puntos: 2
Pregunta Agrupar registros por mes

Buenas a todos!!

Tengo un a duda de SQL, a ver si me pueden echar una mano..

Estoy intentado hacer una consulta para contar los registro por fechas pero agrupados por meses. Ejemplo:

Tengo la tabla ventas...

FECHA PRODUCTO
12/02/2009 producto1
23/02/2009 producto2
07/04/2009 producto3
21/07/2009 producto4
25/07/2009 producto5

Y lo que intento es contar cuantas ventas hay en un año, pero agrupadas por meses para postriormente sacar una media:

me tendria que salie algo como:

CONTADOR MES
2 02 o febrero
1 04 o abril
2 07 o julio


La select que tengo es esta:

Código sql:
Ver original
  1. SELECT   COUNT (*) AS contador, fecha
  2.     FROM ventas
  3.    WHERE fecha >= '01/01/2009'
  4.      AND fecha < '01/01/2010'
  5. GROUP BY fecha
  6. ORDER BY fecha ASC;

pero me sale algo como esto:

CONTADOR FECHA
1 12/02/2009
1 23/02/2009
1 07/04/2009
1 21/07/2009
1 25/07/2009

La cosa es que tiene que ser compatible para todos los gestores de bases de datos.

Muchas Gracias y espero que me puedan ayudar.

Saludos!
  #2 (permalink)  
Antiguo 27/10/2009, 07:18
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Agrupar registros por mes

Bienvenido al util mundo de las funciones...

Código sql:
Ver original
  1. SELECT COUNT (*) AS contador,
  2.              MONTH(fecha) AS mes
  3.     FROM ventas
  4.    WHERE YEAR(fecha)= 2009
  5. GROUP BY MONTH(fecha)
  6. ORDER BY MONTH(fecha) ASC;


Código sql:
Ver original
  1. SELECT AVG(Sbc.contador) AS media2009
  2. FROM (SELECT COUNT (*) AS contador,
  3.            MONTH(fecha) AS mes
  4.            FROM ventas
  5.            WHERE YEAR(fecha)= 2009
  6.            GROUP BY MONTH(fecha)) AS Sbc;


o mejor


Código sql:
Ver original
  1. SELECT COUNT (*) AS contador,
  2.              YEAR(fecha) AS anno,
  3.              MONTH(fecha) AS mes
  4.     FROM ventas
  5. GROUP BY YEAR(fecha), MONTH(fecha)
  6. ORDER BY YEAR(fecha), MONTH(fecha) ASC;


Código sql:
Ver original
  1. SELECT Sbc.anno,
  2.              AVG(Sbc.contador) AS mediaanual
  3. FROM (SELECT COUNT (*) AS contador,
  4.              YEAR(fecha) AS anno,
  5.              MONTH(fecha) AS mes
  6.              FROM ventas
  7.              GROUP BY YEAR(fecha),
  8.                               MONTH(fecha)) AS Sbc;




Quim
  #3 (permalink)  
Antiguo 27/10/2009, 10:16
Avatar de huspy  
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Agrupar registros por mes

Buenas quimfv!

Gracias por contestarme, pero MONTH no es única de Oracle, es que tiene que ser válida para todos los motores de BD.

Saludos!!!
  #4 (permalink)  
Antiguo 27/10/2009, 18:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 2 meses
Puntos: 360
Respuesta: Agrupar registros por mes

Como dificil tener contentos a todos los gestores de bases de datos.

La función ue veo es muy estandar entre los rdbms es extract.

Código SQL:
Ver original
  1. SELECT Sbc.anno,
  2.              AVG(Sbc.contador) AS mediaanual
  3. FROM (SELECT COUNT (*) AS contador,
  4.              EXTRACT(YEAR FROM fecha) AS anno,
  5.              EXTRACT(MONTH FROM fecha) AS mes
  6.              FROM ventas
  7.              GROUP BY EXTRACT(YEAR FROM fecha),
  8.                               EXTRACT(MONTH FROM fecha)) AS Sbc;

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 28/10/2009, 02:16
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Agrupar registros por mes

Si claro las funciones pueden variar en funcion del sistema gestor de bases de datos que uses.... si te impones que sea compatible con TODOS los motores te limitas mucho e incluso hay motores que no implementan exactamente igual el Sql estandar con lo que incluso trabajando con el Sql digamos de libro de texto puedes encontarte con problemas en algun motor....


Guguelando veras la diferencias


MySql - Date and Time Functions



Sql Server - Date and Time Functions


En cambio parece que Oracle no tiene MONTH() ni YEAR() o no las encuentro lo equivalente seria lo que te dijo Huesos

Cita:
EXTRACT
Extracts and returns the value of a specified datetime field from a datetime or interval value expression Values That Can Be Extracted:

YEAR
MONTH
DAY
HOUR
MINUTE
SECOND
TIMEZONE_HOUR
TIMEZONE_MINUTE
TIMEZONE_REGION
TIMEZONE_ABBR

Tu consulta sin funciones seria realmente complicada, suponiendo que las funciones de agregacion (sum, count, avg...) si sean comunes a todos los motores....que lo son.


Quim
  #6 (permalink)  
Antiguo 28/10/2009, 05:37
Avatar de huspy  
Fecha de Ingreso: diciembre-2008
Ubicación: Málaga, España
Mensajes: 120
Antigüedad: 15 años, 4 meses
Puntos: 2
Respuesta: Agrupar registros por mes

Gracias a ambos!

Me ha servido de gran ayuda vuestras respuestas y me va muy bien la select en oracle y mysql.

Muchas Gracias!!!!
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 05:53.