FineReport帆软报表交付工程师模拟题—报表篇第三题求同环比
摘要:本文介绍了一种使用SQL自连接计算销售数据同环比的方法。通过创建临时表存储年月销售数据,采用自连接方式关联同期和上月数据,避免了因数据不全导致窗口函数偏移的误差。关键步骤包括:1)查询指定年份及前一年数据;2)通过日期计算实现同期和上月关联;3)处理分母为零情况;4)在前端设置百分比格式和条件样式。该方法虽然效率不如窗口函数,但能确保数据准确性,适用于不完整的时间序列数据计算。最后提供了报表
·
仅分享个人解题思路,方法不只一种
------------------------------------------------------------
步骤:1.先查询出各年月的销售数据

2.在查询出同期年份,同期销量,上月,上月销量,代码如下:
我用的是自连接的方式求同环比,这里不用lag偏移函数求,因为年月的数据不全,偏移的话会有误差
with tab1 as ( -- 将查询的销量写入一张临时表
select
strftime('%Y-%m', b.订购日期) as 年月,
date(strftime('%Y-%m',b.订购日期) || '-01') as 日期, -- 使用月份第一天
sum(a.数量) as 销量
FROM 订单明细 a
left join 订单 b ON a.订单ID = b.订单ID
where strftime('%Y', b.订购日期) in ('${年份}', '${年份-1}') -- 查询出当前的年份和当前年份的去年,方便后面的同期销量计算,比如输入1997,这里过滤的就是1997年和1996年
GROUP BY strftime('%Y-%m', b.订购日期)
)
SELECT curr.年月,
curr.销量,
pre_ym.年月 as 同期年月,
pre_ym.销量 as 同期销量,
(case when pre_ym.销量=0 then 0 else curr.销量/pre_ym.销量 - 1 end) as 同比,
pre_m.年月 as 上月,
pre_m.销量 as 上月销量,
(case when pre_m.销量=0 then 0 else curr.销量/pre_m.销量 - 1 end) as 环比
from tab1 curr
left join tab1 pre_ym on pre_ym.年月=strftime('%Y-%m',date(curr.日期,'-1 year'))
left join tab1 pre_m on pre_m.年月=strftime('%Y-%m',date(curr.日期),'-1 month')
where substr(curr.年月, 1, 4) = '${年份}' -- 过滤出当前年份,比如前面输入1997,这里过滤出1997年的数据
order by curr.年月

3.查询出年份数据字典,添加年份参数并绑定
4.制作表格,将查询的数据拖入表格,设置隔行换色
5.将同环比设置格式为百分比,保留一位小数,在sql中处理也可以,不过在工作中一般会在报表前端设置
6.为同比增长率、环比增长率设置为负标红加粗
7.合并单元格,添加公式,设置标题
8.保存预览结果
这道题最重要考的是在sql中计算同环比,一般用窗口函数能解决,也可以使用自连接,不过效率不高,在实际中根据实际情况而定
更多推荐


所有评论(0)