1 -- 当年/月/日累计指标数据初始化 2 with data_day as ( 3 select 'a' name,'2016-07-01' as day, 1 as value union all 4 select 'a' name,'2017-07-01' as day, 2 as value union all 5 select 'a' name,'2018-05-01' as day, 3 as value union all 6 select 'a' name,'2018-06-01' as day, 4 as value union all 7 select 'a' name,'2018-07-01' as day, 5 as value union all 8 select 'a' name,'2018-07-02' as day, 6 as value union all 9 select 'a' name,'2018-07-03' as day, 7 as value union all 10 select 'a' name,'2018-08-01' as day, 8 as value union all 11 select 'a' name,'2018-08-03' as day, 9 as value union all 12 select 'a' name,'2018-09-01' as day, 10 as value union all 13 select 'a' name,'2018-09-02' as day, 11 as value union all 14 select 'a' name,'2018-09-03' as day, 12 as value 15 ) 16 ,cal as ( 17 select '2018-07-01' as day union all 18 select '2018-07-02' as day union all 19 select '2018-07-03' as day union all 20 select '2018-08-01' as day union all 21 select '2018-08-02' as day union all 22 select '2018-08-03' as day union all 23 select '2018-09-02' as day union all 24 select '2018-09-03' as day 25 ) 26 select 27 t2.name 28 ,t1.day 29 ,sum(case when t1.day = t2.day then value end) as value_d -- 当日数量 30 ,sum(case when trunc(t1.day,'MM') = trunc(t2.day,'MM') then value end) as value_m -- 当月累计 31 ,sum(case when trunc(t1.day,'YY') = trunc(t2.day,'YY') then value end) as value_y -- 当年累计 32 ,sum(value) as value_t -- 全量累计 33 from cal t1 34 join data_day t2 35 on 1 = 1 36 where t2.day <= t1.day 37 group by 38 t2.name 39 ,t1.day 40 order by 41 t2.name 42 ,t1.day 43 ;
+-------+-------------+----------+----------+----------+----------+--+ | name | day | value_d | value_m | value_y | value_t | +-------+-------------+----------+----------+----------+----------+--+ | a | 2018-07-01 | 5 | 5 | 12 | 15 | | a | 2018-07-02 | 6 | 11 | 18 | 21 | | a | 2018-07-03 | 7 | 18 | 25 | 28 | | a | 2018-08-01 | 8 | 8 | 33 | 36 | | a | 2018-08-02 | NULL | 8 | 33 | 36 | | a | 2018-08-03 | 9 | 17 | 42 | 45 | | a | 2018-09-02 | 11 | 21 | 63 | 66 | | a | 2018-09-03 | 12 | 33 | 75 | 78 | +-------+-------------+----------+----------+----------+----------+--+
1 select 2 day 3 ,sum(value) over(partition by trunc(day,'MM') order by day asc) as value_asc1 -- 当月累计 4 ,sum(value) over(partition by trunc(day,'MM') order by day rows between unbounded preceding and current row) as value_asc2 -- 当月累计 5 from ( 6 select '2018-08-01' as day ,100 as value union all 7 select '2018-08-03' as day ,100 as value 8 ) t 9 ;
+-------------+-------------+-------------+--+ | day | value_asc1 | value_asc2 | +-------------+-------------+-------------+--+ | 2018-08-01 | 100 | 100 | | 2018-08-03 | 200 | 200 | +-------------+-------------+-------------+--+