最近在开发报表过程中,业务本着通过报表最大化实现便捷操作,提出了几点想法:
1.批量输入客户名称和账户,在返回结果时,可以看出输入的待匹配的客户名称或账户对应的数据行,便于业务导出结果后进行VLOOKUP。
2.输入账户信息,返回账户粒度数据信息;输入客户名称,返回客户粒度数据信息。(由于一个客户名下可能有多个账户,客户粒度要高于账户粒度。)
这些想法确实在之前报表开发过程中没有遇到过,不得不说这位业务把我扩展出的可以批量查询的文本参数组件使用的很极致,我最初的想法是(1)批量输入n个账户查询;(2)批量输入n个客户名称查询;(3)批量输入m个账户和(n-m)个客户名称混搭查询。好像之前的业务同事只用了(1)和(2),显然这个业务用了(3),否则不会提出这样的报表优化建议。
问题背景
业务想要导出某个时间点客户的存款信息,便于业务考核。为了演示,构造一个数据集,如下:
字段说明:
crm_cust_no—客户号
province—省份
city—城市
cust_name—客户名称
agt_num—账户
dpsit_bal—账户余额
这里不考虑时间因素,以某天数据切片进行分析。
需求1解决方式
先分享下,将永洪BI自带文本参数扩展出批量查询功能,首先向报告中拖入一个文本参数组件
对文本参数组件进行设置:
随后,在报告菜单栏,报告—脚本
跳出脚本界面后,选择“变化时运行”,输入以下语句:
注:split(/[\s\n]/) — 按照空格或者换行符进行分割。
最后,在表组件设置筛选条件,如下图所示:
即可实现批量输入账户或客户名称进行查询。效果如下:
回归正题,为了解决业务需求1,回到制作报告界面,选中表组件,数据界面新建计算列:
计算类型选择SQL语句,数据以下语句:
case when agt_num in (param["账户数组"]) then agt_num else cust_name end
将计算列拖入表组件,即可实现。效果如下:
注:这种方式如果在抽取数据前提下将会失效。
需求2解决方式
方式一:在制作报告时使用表组件的汇总功能
因为客户粒度高于账户粒度,所以在表组件中移除agt_num列。查看报告效果如下:
方式二:在数据集中使用rollup函数
我们需要对数据集语句进行更改,原SQL语句:
SELECT
province
,cust_name
,cast(agt_num as char(25)) agt_num
,dpsit_bal
from test_db.test_20230325
新SQL语句:
select
province
,cust_name
,coalesce(agt_num,cust_name) search_key
,bal
from
(
select
province
,cust_name
,agt_num
,sum(dpsit_bal) bal
from test_db.test_20230325 t
group by province,cust_name,agt_num with rollup
having cust_name is not null
) a
在制作报告中,用search_key列代替方式一的计算列,同时修改表组件的筛选条件:
即可实现同样效果,同时还可以优化需求1的解决方式在抽取数据前提下失效的情况。
不足之处,还请各位大神指正~