Ir al contenido


Foto

Crear consulta de los Ultimos 12 meses


  • Por favor identifícate para responder
11 respuestas en este tema

#1 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 28 abril 2012 - 11:18

Pues eso, necesito hacer una consulta que me devuelve la sumatoria de un campo de los ultimos 12 meses a paritr del mes actual aun sin tener sumatoria alguna, por ejemplo, este es un resultado que espero obtener a partir de este MES:



delphi
  1. Mayo 2011 => 0
  2. Junio 2011 => 2
  3. Julio 2011 => 5
  4. Agosto 2011 => 0
  5. Septiembre 2011 => 0
  6. Octubre 2011 => 1
  7. Noviembre 2011 => 7
  8. Diciemrbe 2011 => 3
  9. Enero 2012 => 0
  10. Febrero 2012 => 2
  11. Marzo 2012 => 0
  12. Abril 2012 => 5



Como veran Mes[Ano] => suma es lo que quiero obtener, (La sumatoria es lo de menos para mi, me interesa los meses).

Saludos.

  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 28 abril 2012 - 04:54

Teniendo una tabla una tabla llamada "test" con los campos Fecha (Datetime) y Valor(int)

Tabla


delphi
  1. 2013-02-01 00:00:00, 1
  2. 2013-03-01 00:00:00, 2



Consulta

select Mes, Valor from (
  select 'Enero' as Mes, (13 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 1
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Febrero' as Mes, (14 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 2
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Marzo' as Mes, (15 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 3
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Abril' as Mes, (16 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 4
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Mayo' as Mes, (17 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 5
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Junio' as Mes, (18 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 6
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Julio' as Mes, (19 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 7
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Agosto' as Mes, (20 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 8
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Septiembre' as Mes, (21 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 9
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Octube' as Mes, (22 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 10
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Noviembre' as Mes, (23 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 10
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
  union select 'Diciembre' as Mes, (24 - EXTRACT(MONTH FROM Now())) mod 12 as Orden, ifnull(sum(Valor),0) as Valor from test where EXTRACT(MONTH FROM Fecha) = 12
    and Fecha between CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE) and DATE_ADD(CAST(DATE_FORMAT(NOW() ,'%Y-%m-01') as DATE), INTERVAL 1 YEAR)
) t order by orden


Resultado


delphi
  1. Abril, 0
  2. Mayo, 0
  3. Junio, 0
  4. Julio, 0
  5. Agosto, 0
  6. Septiembre, 0
  7. Octube, 0
  8. Noviembre, 0
  9. Diciembre, 0
  10. Enero, 0
  11. Febrero, 1
  12. Marzo, 2



Pedazo de consulta  (h) ... aunque ahora seguro que viene alguno y lo hace con solo dos lineas  ^o|

Saludos


  • 0

#3 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 28 abril 2012 - 09:29

Hola,
A ver si entiendo. ¡Deseas obtener obtener una consulta que muestre los totalizados agrupados por mes hacia un año atras dada una fecha?

Es decir que si por ejemplo, si pides que muestre la informacion anual a julio del año en curso entonces deberia mostrar:

agosto año-1
septiembre año-1
octubre año-1
noviembre año-1
diciembre año-1
enero año-curso
febrero año-curso
marzo año-curso
abril año-curso
mayo año-curso
junio año-curso
julio año-curso

Es decir no interesa que mes se ingrese, debe completarse la informacion a un uño, de ser necesario se debe .

Si se ingresare enero obtendriamos:
febrero año-1
...
dicimebre año-1
enero año-curso

Y si se ingresara diciembre, el calendario de toda la vida:
enero año-curso
...
diciembre año-curso

A decir verdad no creo que resulte tan facil hacer una consulta de forma simple.  Pienso tal vez que se podria y deberia hacer empleando un SP. Hay que pensarlo bastante

Domingo, tengo mis reservas si una consulta como la que expones realmente de resultados esperados.

Fernando ¿podrias darnos mas informacion sobre como esta estructurada la tabla y/o si esta vinculada a otras en donde necesite extraer registros?

Saludos,
  • 0

#4 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 29 abril 2012 - 04:34

Tienes razón delphius, entendí mal la pregunta y la consulta, en vez de mostrar 12 meses hacia atrás, muestra 12 meses hacia adelante. Pero el concepto sigue siendo el mismo, solo hay que jugar un poco con las fechas de la consulta.  :)
  • 0

#5 eduarcol

eduarcol

    Advanced Member

  • Administrador
  • 4.483 mensajes
  • LocationVenezuela

Escrito 29 abril 2012 - 07:06

Comenzemos por algo sencillo, esta presentacion te gusta???

Select lPad(Cast(Ayo as Varchar(4)), 4, '0') || lPad(Cast(Mes as Varchar(2)), 2, '0') as Periodo,
      Sum(Total) as Monto
from
(Select Extract(month from FechaVenta) as Mes, Extract(year from FechaVenta) as Ayo, Total
from vta where fechaventa >= current_date - 365)

Group by Periodo


Tengo dudas respecto a la resta de la fecha, pero en teoria deberia servir.
  • 0

#6 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 29 abril 2012 - 09:16

Hola, @Delphius, exactamente asi es como lo expresas, @eduarcol, bastante corto la consulta, pero tengo mis dudas, y si un mes no tiene sumatoria o conteo alguno me lo mostrara?.

Saludos.
  • 0

#7 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 29 abril 2012 - 01:18

Haiendo pruebas sin Datos solo obteniendo los meses hice esto:

SELECT CONCAT(MONTHNAME(datetime), ' ' , YEAR(datetime)) AS YearMonth
FROM (
    select (curdate() - INTERVAL (a.a + (1 * b.a) + (10 * c.a)) MONTH) as datetime
    from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b
    cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c
    LIMIT 12
) AS t
ORDER BY datetime ASC


Obtengo esto con algunos problemas:



delphi
  1. July 2011
  2. August 2011
  3. September 2011
  4. October 2011
  5. November 2011
  6. December 2011
  7. January 2012
  8. February 2012
  9. February 2012
  10. March 2012
  11. March 2012
  12. April 2012



Como veran febrero y marzo de 2012 estan repetidos, a ver si me echan una mano con esto.

Saludos.
  • 0

#8 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 abril 2012 - 01:44

Hola Fernando disculpa la preguntonta pero ¿Para que sirve Interval?
Me resulta ajeno esa cláusula, yo soy de mundo Firebird y me desconcierta la operatoria que incluíste en ella.
Intuyo que el problema de los repetidos viene dado por la parte de los resultados devuelvos bajo el alias c.
Lo otro que me confunde es que tus UNIONs llega hasta un SELECT 9. Me cuesta entender la unión de todo esto.

Yo me estaba pensando en un SP que directamente regrese los datos haciendo consultas más simples en lugar de tratar de hacerlo "SQL Puro"; pero aún así todavía me hace falso contacto los cables de la cabeza  :D

Saludos,
  • 0

#9 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 29 abril 2012 - 01:51

Para mejor claridad Interval(), yo pudiera hacerlo con un SP, pero hay dos detalles, la BD de datos de MySQL donde quiero aplicar la consulta el motor configurado no soporta SP. Cuando viene a ver, debere hacer uso de una mezcla entre PHP y MySQL para lograr eso.
  • 0

#10 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.295 mensajes
  • LocationArgentina

Escrito 29 abril 2012 - 02:03

Para mejor claridad Interval(), yo pudiera hacerlo con un SP, pero hay dos detalles, la BD de datos de MySQL donde quiero aplicar la consulta el motor configurado no soporta SP. Cuando viene a ver, debere hacer uso de una mezcla entre PHP y MySQL para lograr eso.

Ha... "pequeño" detalle  :( Ya había visto el "truco" que había dejado sobre PHP y me dije que eso tenía relación con esto.

Bueno, a ver... ya voy entendiendo un poquito mejor la consulta. Ando arreglando el manojo de cables que la caja de fusibles está quemada...  :D
Porque tampoco sería bueno disparar 12 consultas... una para cada mes,  :D  :p

Saludos,
  • 0

#11 JuanPalmaSoft

JuanPalmaSoft

    Advanced Member

  • Miembros
  • PipPipPip
  • 76 mensajes
  • LocationDistrito Federal

Escrito 17 mayo 2012 - 06:01

disculpen el tema lo vi hoy, pero tengo algo de consulta o procedimietos para esto los busco y los subo, pero creo que lo mejor hubiera sido poner un juego de datos y ver que se queria obtener. porque si tuviera enero de varios años los estan totalizando, tengo pro ejemplo consultas hechas que me dan los ultimos 12 meses de algo. por e¡jemplo los ultimos 12 meses de salarios de una persona, o los ultimos 12 meses de recivos de agua o liz, pudiera ser esta la idea?
  • 0

#12 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 18 mayo 2012 - 06:47

disculpen el tema lo vi hoy, pero tengo algo de consulta o procedimietos para esto los busco y los subo, pero creo que lo mejor hubiera sido poner un juego de datos y ver que se queria obtener. porque si tuviera enero de varios años los estan totalizando, tengo pro ejemplo consultas hechas que me dan los ultimos 12 meses de algo. por e¡jemplo los ultimos 12 meses de salarios de una persona, o los ultimos 12 meses de recivos de agua o liz, pudiera ser esta la idea?


Claro mi estimado, nos podría ser útil.

Saludos.
  • 0




IP.Board spam blocked by CleanTalk.