最容易的写法就一个自关联了,注意除数为0的特殊处理
select a.*,
round(decode(b.SALE_MONEY,
0,
null,
(a.SALE_MONEY - b.SALE_MONEY) / b.SALE_MONEY) * 100,
2) || '%' 环比增长率
from sql2004 a
left join sql2004 b
on trunc(to_date(a.tyear || lpad(a.tmonth, 2, 0), 'yyyymm') - 1, 'mm') =
to_date(b.tyear || lpad(b.tmonth, 2, 0), 'yyyymm')
如果不用自关联,只对这个表查一次,可以使用开窗函数,这里先假设数据中间不会存在月份缺失
select TYEAR,
TMONTH,
SALE_MONEY,
round(decode(l_SALE_MONEY,
0,
null,
(SALE_MONEY - l_SALE_MONEY) / l_SALE_MONEY) * 100,
2) || '%' 环比增长率
from (select a.*,
lag(SALE_MONEY) over(order by tyear , tmonth ) l_SALE_MONEY
from sql2004 a);
如果好巧不巧,刚好关门了一个月而且没插入对应月份的数据,那么也还是可以使用开窗函数,不过要换成range滑动窗口了
select TYEAR,
TMONTH,
SALE_MONEY,
round(decode(l_SALE_MONEY,
0,
null,
(SALE_MONEY - l_SALE_MONEY) / l_SALE_MONEY) * 100,
2) || '%' 环比增长率
from (select a.*,
max(SALE_MONEY) over(order by tyear * 12 + tmonth range between 1 preceding and 1 preceding) l_SALE_MONEY
from sql2004 a)
在数据完整的情况下,上述3个sql输出结果都是一样的