PART1 头部国际药企B Dashboard看板案例分享 Part 1综述
PART2 头部国际药企B Dashboard看板案例分享 Part 2架构与设计(aka 拆指标与数据建模)
PART3 头部国际药企B Dashboard看板案例分享 Part 3图表制作
经过Part 1 《头部国际药企B Dashboard看板案例分享 Part 1综述》的需求整理后,进入Part 2,架构与设计工作。
I 报表形式
数据的价值在于通过数字,可以方便、准确、抽象的描述一段时间内发生的事情;而经营分析是对业务运营效果的监控。因此将运营指标开发为定期发布的周报、月报等,是最适合经营分析需求的报表形式。
II 运营指标梳理
通过使用金额、数量2种测量方式的运营指标是最常见的度量经营效果的指标类型。通过金额类型的指标(及其派生指标)值变化反映收入的波动;通过数量类型的指标(及其派生指标)值的变化反映动销的波动。结合下钻分析(结构分析)、对比分析和趋势分析,就能比较快速的洞察波动原因,判断今后波动方向。
美*平台提供的数据粒度是城市+ 连锁 + 店铺 + SKU,金额口径为1 美*平台GTV,数量指标有 2 销售数量、3 订单数、4 顾客数、5 动销连锁数。对店铺字段进行简单清洗后,打上了重点客户、销售渠道等标签。从货看场的角度计算了派生指标:6 动销店铺数;从场看货的角度计算了7 动销SKU数;并按环比、同比2种对比分析方法,计算了以上7个指标的环比与同比值,支持从时间维度按月、按旬(每月分上下旬)筛选;从销售渠道筛选;从区域维度按省份、按城市筛选;
# |
指标名称 |
指标类型 |
原子/派生 |
对比方式 |
是否可加 |
备注 |
1 |
美*平台GTV |
金额 |
原子 |
环比,同比 |
是 |
|
2 |
销售数量 |
数量 |
原子 |
环比,同比 |
是 |
|
3 |
订单数 |
数量 |
原子 |
环比,同比 |
是 |
无法对交叉购买去重,精度问题忽略 |
4 |
顾客数 |
数量 |
原子 |
环比,同比 |
是 |
无法对交叉购买去重,精度问题忽略 |
5 |
动销连锁数 |
数量 |
原子 |
环比,同比 |
半可加 |
区域上卷至全国时,可加 |
6 |
动销店铺数 |
数量 |
派生 |
环比,同比 |
半可加 |
区域上卷至城市时,可加 |
7 |
动销SKU数 |
数量 |
派生 |
环比,同比 |
否 |
|
III 数据建模
按此要求,ADS建模如下
# |
列名 |
数据类型 |
长度 |
描述 |
1 |
dateperiod |
String |
|
旬 |
2 |
yearmonth |
Int32 |
10 |
报告年月 |
3 |
city |
String |
|
城市 |
4 |
province |
String |
|
省份 |
5 |
region |
String |
|
区域 |
6 |
chain_client |
String |
|
厂商口径连锁名称 |
7 |
chain_prop |
String |
|
连锁属性 |
8 |
chn_prop |
String |
|
销售渠道(O2O/B2C) |
9 |
upc |
Int64 |
19 |
SKU UPC编码 |
10 |
pname |
String |
|
品名 |
11 |
brand |
String |
|
品牌 |
12 |
pdt_prop |
String |
|
商品分销方式 |
13 |
pdt_key |
String |
|
重点商品 |
14 |
qty |
Float64 |
22 |
销售数量 |
15 |
gtv |
Float64 |
22 |
美*平台GTV |
16 |
nbsk |
Int32 |
10 |
订单数 |
17 |
nstr |
Int32 |
10 |
动销连锁数 |
18 |
nmbr |
Int32 |
10 |
顾客数 |
IV FineBI数据准备
在 cube表建模前,通过FineBI数据准备功能,基于ods做了尝试,最终采纳按不同的日期期间进行聚合的建模方式,开发日颗粒度(另一套报表)和旬颗粒度2套cube,可以在报表性能和开发容易度2个维度中,均取得不错的反馈。最终交付的报表按“演、练、战”3种场景进行了定位。“演场景”,给厂商老板看的正式交付报表(Part 1截图);“练场景”, 给拜耳运营日常使用的报表;以及“战场景”,按排列组合的方式,将各种维度交叉组合后开发结构分析图表组合。而这2套cube在3个场景中均能通用,并且性能优良,充分体现了计算工程师高超的建模能力的。下一Part 将进入图表开发介绍。
SELECT * FROM factory.bayer_dm_sales_rollup
WHERE
1 = 1
${IF(LEN(by_yearmonth) == 0, "", "AND yearmonth IN ('"+by_yearmonth+"')")}
${IF(LEN(by_dateperiod) == 0, "", "AND dateperiod IN ('"+by_dateperiod+"')")}
${IF(LEN(by_city) == 0, "", "AND city IN ('"+by_city+"')")}
${IF(LEN(by_province) == 0, "", "AND province IN ('"+by_province+"')")}
${IF(LEN(by_region) == 0, "", "AND region IN ('"+by_region+"')")}
${IF(LEN(by_chain_client) == 0, "", "AND chain_client IN ('"+by_chain_client+"')")}
${IF(LEN(by_chain_prop) == 0, "", "AND chain_prop IN ('"+by_chain_prop+"')")}
${IF(LEN(by_chn_prop) == 0, "", "AND chn_prop IN ('"+by_chn_prop+"')")}
${IF(LEN(by_brand) == 0, "", "AND brand IN ('"+by_brand+"')")}
${IF(LEN(by_pdt_prop) == 0, "", "AND pdt_prop IN ('"+by_pdt_prop+"')")}
${IF(LEN(by_pdt_key) == 0, "", "AND pdt_key IN ('"+by_pdt_key+"')")}
${IF(LEN(by_upc) == 0, "", "AND upc IN ('"+by_upc+"')")}
${IF(LEN(by_pname) == 0, "", "AND pname IN ('"+by_pname+"')")}
|