繁体   English   中英

sql按月和年求和

[英]sql sum by month and year

在此处输入图片说明

我已经尝试通过编写相关查询但未能产生输出....我现在只尝试使用连接

SELECT sum(t1.acc)
    ,t1.mon
    ,t1.yr
FROM gl t1
WHERE mon IN (
        SELECT mon
        FROM gl t2
        WHERE t2.mon <= t1.mon
            AND t2.yr = t1.yr
        )
GROUP BY t1.mon
    ,t1.yr

您应该将数据与自身连接并应用总和条件。

drop table if exists #input_data

select * into #input_data
from
(
    select 1 as acc, 5  as mon, 2020 as yr union all
    select 2 as acc, 6  as mon, 2020 as yr union all
    select 3 as acc, 4  as mon, 2021 as yr union all
    select 4 as acc, 3  as mon, 2021 as yr
) d

select
    sum(e0.acc) as acc_sum,
    d.mon,
    d.yr
from 
    #input_data d
    join #input_data e0 
        on e0.yr = d.yr and e0.mon <= d.mon
group by
    d.yr, d.mon
order by
    d.yr, d.mon

如果您在同一个mon/yr有多个记录,那么您必须添加额外的分组。

drop table if exists #input_data

select * into #input_data
from
(
    select 1 as acc, 5  as mon, 2020 as yr union all
    select 2 as acc, 6  as mon, 2020 as yr union all
    select 3 as acc, 4  as mon, 2021 as yr union all
    select 4 as acc, 3  as mon, 2021 as yr union all
    select 0 as acc, 5  as mon, 2020 as yr 
) d

;with cte_source as 
(
    select
        sum(acc) as acc,
        mon,
        yr
    from #input_data d
    group by d.yr, d.mon
)
select
    sum(e0.acc) as acc_sum,
    d.mon,
    d.yr
from 
    cte_source d
    join cte_source e0 
        on e0.yr = d.yr and e0.mon <= d.mon
group by
    d.yr, d.mon
order by
    d.yr, d.mon

您似乎想要一年内的累计金额:

select year, mon, sum(acc) over (partition by year order by mon)
from t
order by year, acc;

以原始顺序恢复数据有点棘手,但只需要一个明确的order by

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM