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