una ultimo separar recognized por obtener not nombre name mostrar mes formato fecha eomonth como built año sql date group-by db2

ultimo - obtener mes y año de una fecha sql



Genere informe de año a mes por mes en SQL (4)

Debería intentar unir la tabla a sí mismo mediante una condición de mes por mes y generar un código de grupo de mes sintético para agrupar de la siguiente manera:

select sum(value), year, up_to_month from ( select a.value, a.year, b.month as up_to_month from table as a join table as b on a.year = b.year and b.month => a.month ) group by up_to_month, year

da eso:

db2 => seleccionar * de mi.rep

VALUE YEAR MONTH ----------- ----------- ----------- 100 2011 1 200 2011 2 300 2011 3 400 2011 4

db2 -t -f rep.sql

1 YEAR UP_TO_MONTH ----------- ----------- ----------- 100 2011 1 300 2011 2 600 2011 3 1000 2011 4

Posible duplicado:
Total acumulado por registros agrupados en la tabla

Estoy tratando de armar una declaración SQL que devuelve la SUMA de un valor por mes, pero en base a un año a la fecha. En otras palabras, para el mes de marzo, estoy buscando obtener la suma de un valor para los meses de enero, febrero y marzo.

Puedo hacer fácilmente un grupo para obtener un total de cada mes por sí mismo, y potencialmente calcular el valor de año a fecha que necesito en mi aplicación a partir de estos datos al recorrer el conjunto de resultados. Sin embargo, esperaba poder manejar parte de este trabajo con mi declaración de SQL.

¿Alguna vez alguien ha abordado este tipo de problema con una declaración SQL y, de ser así, cuál es el truco que me falta?

Mi instrucción SQL actual para datos mensuales es similar a la siguiente:

Select month, year, sum(value) from mytable group by month, year

Si incluyo una cláusula where en el mes, y solo grupo por año, puedo obtener el resultado de un mes que estoy buscando:

select year, sum(value) from mytable where month <= selectedMonth group by year

Sin embargo, esto requiere que tenga un mes particular preseleccionado o que utilice 12 declaraciones de SQL diferentes para generar un conjunto de resultados limpio.

¡Cualquier guía que se pueda proporcionar sería muy apreciada!

Actualización: los datos se almacenan en un IBM iSeries.


Por lo que sé, DB2 no admite funciones de ventana aunque no sé si esto también es compatible con la versión de iSeries.

Si las funciones de ventana son compatibles (creo que IBM las llama funciones OLAP), entonces lo siguiente debe devolver lo que desea (siempre que entendí su pregunta correctamente)

select month, year, value, sum(value) over (partition by year order by month asc) as sum_to_date from mytable order by year, month


declare @Q as table ( mmonth INT, value int ) insert into @Q values (1,10), (1,12), (2,45), (3,23) select sum(January) as UpToJanuary, sum(February)as UpToFebruary, sum(March) as UpToMarch from ( select case when mmonth<=1 then sum(value) end as [January] , case when mmonth<=2 then sum(value) end as [February], case when mmonth<=3 then sum(value) end as [March] from @Q group by mmonth ) t

Produce:

UpToJanuary UpToFebruary UpToMarch 22 67 90

Captas la idea ¿cierto?

NOTA : Esto podría hacerse más fácilmente con las tablas PIVOT pero no sé si está usando SQL Server o no.


create table mon ( [y] int not null, [m] int not null, [value] int not null, primary key (y,m)) select a.y, a.m, a.value, sum(b.value) from mon a, mon b where a.y = b.y and a.m >= b.m group by a.y, a.m, a.value

2011 1 120 120 2011 2 130 250 2011 3 500 750 2011 4 10 760 2011 5 140 900 2011 6 100 1000 2011 7 110 1110 2011 8 90 1200 2011 9 70 1270 2011 10 150 1420 2011 11 170 1590 2011 12 600 2190