输入缺少月份并在一个存储过程中计算运行总计

时间:2017-09-05 12:23:04

标签: sql sql-server running-total

如何从此表中选择数据

Yr     Month    El1       Value    
----   ------   -------   ------

2017   2        AT010     100        
2017   3        AT010     100         
2017   4        AT010     50        
2017   5        AT010     150     
2017   3        BE020     10      
.......

并按以下方式将其插入另一个表

Yr     Month    El1       Value    
----   ------   -------   ------

2017   0        AT010     0        
2017   1        AT010     0         
2017   2        AT010     100        
2017   3        AT010     200  
2017   4        AT010     250         
2017   5        AT010     400        
2017   6        AT010     400        
2017   7        AT010     400        
2017   8        AT010     400    
2017   9        AT010     400  
2017   10        AT010     400    
2017   11        AT010     400        
2017   12        AT010     400    
2017   0        BE020     0  
2017   1        BE020     0    
2017   2        BE020     0  
2017   3        BE020     10   
2017   4        BE020     10   
2017   5        BE020     10   
2017   6        BE020     10   
2017   7        BE020     10   
2017   8        BE020     10    
2017   9        BE020     10   
2017   10        BE020    10   
2017   11        BE020    10    
2017   12        BE020    10 

.......

我正在尝试从0到12插入缺失的月份并同时计算运行总计。 我使用this建议进行总计算;但是,我无法弄清楚如何进入失踪月份。 此代码将用于每日ETL作业的存储过程。

1 个答案:

答案 0 :(得分:2)

嗯。嗯。 。 。生成行,然后使用left joinouter apply来引入值。这是一种方式:

with yyyymm as (
      select 2017 as yr, 1 as mom
      union all
      select yr, mon + 1
      from yyyymm
      where mon + 1 <= 12
     )
select yyyymm.yr, yyyymm.mon, coalesce(e.el1, 0) as el1
from yyyymm cross join
     (select distinct el1 from t) e outer apply
     (select sum(t.value)
      from t
      where t.el1 = e.el1 and
            t.yr = yyyy.yr and
            t.month <= yyyy.mon
     ) tt
order by e.el1, yyyy.yr, yyyy.month;