目录
挑战FineBI极限的Dashboard看板案例分享 Part 1 综述
挑战FineBI极限的Dashboard看板案例分享 Part 2 设计与架构(1)建模
挑战FineBI极限的Dashboard看板案例分享 Part 2 设计与架构(2)看板设计
挑战FineBI极限的Dashboard看板案例分享 Part 3 图表设计
I 确定Report Dashboard模式
先简单介绍一下数据产品的作用,是将企业数字化、信息化成果可视化后,用于洞察结果、验证假设并预测趋势。要实现洞察结果,需要支持指标的拆解和维度/标签的钻取这2大功能。
再简单介绍一下看板的类型。Report Dashboard 适用于数据利用意识处于早期阶段,分析思路匮乏,对指标的需求比较单一,只能由设计者提供一个抽象普适的分析思路,供用户日常使用。而Customize Dashboard,可以为客户定制大屏的方式交付。
因此从开发背景 看,结合数据产品的作用和看板类型,此项目最适合report Dashboard。
II 确定分析方式与交互
Report Dashboard最通用的分析方式包括杜邦分析、趋势分析、结构分析、明细分析4种。常用的分析交互是维度钻取与旋转, 以及指标的切换。
III 确定表现形式
1 分析表现形式
杜邦分析: 使用KPI组件,通过指引线展示指标分拆逻辑
趋势分析:使用折线图,折线图是用户学习成本最低的表现趋势的图表。作为产品经理,我相信俞军倡导的“创造有利可图的用户价值”观点,产品不是为了满足开发者的野望,而是为了实现用户价值。建议大家在设计时,尽量采用显示用户聪明,而不是显得开发者聪明的方案。
结构分析:柱形图/热力图,理由同上。
明细分析:使用表格,理由同上。
2 交互表现形式
维度钻取:顶部菜单。把相关功能放在一起,方便用户理解。
维度旋转:表头字段中。维度旋转对于大多数用户而言,是个比较陌生的功能。通常做法,是把所有旋转维度(单维度分析)以及旋转维度组合(双维度交叉)的结果,分表格来展现。有多少种旋转维度以及旋转维度组合的需求,就有多少个表格。而这样会对系统负载(成本)和用户体验(用户价值)2个方面,对整个看板产品提出挑战。
因而,在此项目中,我尝试将“维度旋转”功能在FineBI中做了尝试。而要在FineBI中实现维度旋转功能,就必须使用直联数据,通过调取参数,实现维度的切换。图表的设计请见下一Part图表设计,代码实现方式如下:
SELECT
${IF(ib_meas_pos_slt01 = "渠道", "cops.fd_media meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "平台", "cops.plt_name meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "大区", "cops.org_hier_operation2 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "省份", "cops.org_prop_province meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "城市", "cops.org_prop_city meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "门店", "cops.org_name meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "DTP", "cops.fd_category_name4 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "大类", "cops.pdt_hier_catcode1 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "中类", "cops.pdt_hier_catcode2 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "小类", "cops.pdt_hier_catcode3 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "厂牌", "cops.fd_product_prop14 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "通用名", "cops.fd_product_prop15 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "单成分", "cops.fd_product_prop16 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "品牌", "cops.fd_product_prop17 meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "PR", "cops.pdt_prop_key meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_meas_pos_slt01 = "单品", "cops.pdt_name meas_pos_01" + ",'"+ ib_meas_pos_slt01 +"' " +" meas_name", "")}
${IF(ib_idx_pos_slt02 = "销售额", ",sum(cops.fd_final_amount) idx_pos_drilling01a ,sum(cops.fd_final_amount_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "件均价", ",sum(cops.fd_final_amount)/sum(cops.fd_quantity) idx_pos_drilling01a , sum(cops.fd_final_amount_old)/sum(cops.fd_quantity_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "销售件数", ",sum(cops.fd_quantity) idx_pos_drilling01a ,sum(cops.fd_quantity_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "件均毛利额", ",sum(cops.fd_gross_profit)/sum(cops.fd_quantity) idx_pos_drilling01a ,sum(cops.fd_gross_profit_old)/sum(cops.fd_quantity_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "毛利额", ",sum(cops.fd_gross_profit) idx_pos_drilling01a ,sum(cops.fd_gross_profit_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "毛利率", ",sum(cops.fd_gross_profit) / sum(cops.fd_final_amount) idx_pos_drilling01a ,sum(cops.fd_gross_profit_old) / sum(cops.fd_final_amount_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "订单数", ",sum(cops.nbsk) idx_pos_drilling01a ,sum(cops.nbsk_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "客单价", ",sum(cops.fd_final_amount) / sum(cops.nbsk) idx_pos_drilling01a ,sum(cops.fd_final_amount_old) / sum(cops.nbsk_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
${IF(ib_idx_pos_slt02 = "客单件", ",sum(cops.fd_quantity) / sum(cops.nbsk) idx_pos_drilling01a ,sum(cops.fd_quantity_old) / sum(cops.nbsk_old) idx_pos_drilling01b" + ",'"+ ib_idx_pos_slt02 +"' " +" idx_name", "")}
FROM cops
指标切换:下拉框。
|