本文为您介绍中国式报表在数据集参数高阶应用模块的最佳实践内容。
中国式报表是一种具有独特特点和复杂需求的报表形式,通常以 Excel 文件为基础,经过一系列处理最终生成,是多数国内传统企业数据管理与展示的一环,其也称作“复杂报表”。中国式报表的展示形式和 DataWind 的仪表盘有所不同,更类似于数据透视表的样式。
中国式报表的特点:
正是这种复杂且具有特定条件的选择性计算,导致绝大部分的敏捷 BI 的图表功能难以直接且有效地对其进行支持和展示,给数据的呈现和分析带来了一定的挑战。
如下图,中国式报表格式包含多层级的汇总与特定条件下的计算,现有的敏捷 BI 或可视化工具难以直接通过前端的方式来解决:
DataWind 支持利用自定义 SQL 将所需要的字段优先处理出来,然后和原表拼接到一起形成新表,再通过前端基础的数据透视表功能,将结果展示出来,从而在 DataWind 中实现中国式报表的效果。同时,还可利用直连数据集插入参数的功能,使得最终的展示结果比传统 Excel 更灵活优秀。
利用自定义SQL功能,可实现中国式报表在DataWind仪表盘中的呈现:
Before-原始表未处理时展现结果:单纯的数据透视表样式图表,无法达到中国式报表展示的需求。
After-处理后结果:利用自定义SQL的功能,读取原始数据源,将需要字段处理好后和原数据拼接,处理成为所需要的数据集。利用直连可以带入参数的功能,预先将设定好的参数带入,实现前端在展示图表时的灵活性。
注意
由于本次需要利用到 直连数据集 中 插入参数 的功能,所以需要选择 ClickHouse 数据。
按照实际的业务场景,将所需要二次处理的字段通过 SQL 语句处理好,再和原表拼接起来。
示例场景:如业务需要将某些条件下的“销售额”加和到一起,且存在多个加和的场景,这时候需要将每个加和的字段单独拎出来构建之后,再拼接到一起。
单一字段构建。
操作说明:筛选出特定订单日期邮寄方式为“一级”或“二级”的数据,按照“省/自治区、邮寄方式2、订单日期”的分组方式,对销售额和数量进行求和。
select '总计' as `省/自治区`, '一级+二级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `邮寄方式` in('一级', '二级') and `p_date`='2023-09-25' group by `省/自治区`,`邮寄方式2`,`订单日期`
说明
重新命名“邮寄方式2”的原因在于 where 的条件中会用到“邮寄方式”的判断,若不重新命名会导致此判断失效。
生成以下格式的数据:
省/自治区 | 邮寄方式2 | 订单日期 | 销售额 | 数量 |
|---|---|---|---|---|
总计 | 一级+二级 | 2019-01-01 | xxxx | xxxx |
总计 | 一级+二级 | 2019-01-02 | xxxx | xxxx |
...... | ||||
总计 | 一级+二级 | 2019-06-30 | xxxx | xxxx |
多个字段的构建。
操作说明:将构建好的单一字段通过 union all 的方式,上下组合在一起。
注意
在拼接字段时需要保持上下的结构一致。
select '总计' as `省/自治区`, '一级+二级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `邮寄方式` in('一级', '二级') and `p_date`='2023-09-25' group by `省/自治区`,`邮寄方式2`,`订单日期` select '总计' as `省/自治区`, '二级+标准级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `邮寄方式` in('标准级', '二级') and `p_date`='2023-09-25' group by `省/自治区`,`邮寄方式2`,`订单日期` union all select '总计' as `省/自治区`, '一级+二级+标准级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `邮寄方式` in('一级', '二级', '标准级') and `p_date`='2023-09-25' group by `省/自治区`,`邮寄方式2`,`订单日期`
说明
最终需要将这些内容都显示在总计下,所以需要给这些字段一个统一的维度值,且需要和省份处于同一层级,因此可以给这批字段统一定义一个“省/自治区”的值。
生成以下格式的数据:
省/自治区 | 邮寄方式2 | 订单日期 | 销售额 | 数量 |
|---|---|---|---|---|
总计 | 一级+二级 | 2019-01-01 | xxxx | xxxx |
总计 | 一级+二级 | 2019-01-02 | xxxx | xxxx |
...... | ||||
总计 | 一级+二级 | 2019-06-30 | xxxx | xxxx |
总计 | 二级+标准级 | 2019-01-01 | xxxx | xxxx |
...... | ||||
总计 | 二级+标准级 | 2019-06-30 | xxxx | xxxx |
总计 | 一级+二级+标准级 | 2019-01-01 | xxxx | xxxx |
...... | ||||
总计 | 一级+二级+标准级 | 2019-06-30 | xxxx | xxxx |
和原表拼接,即可形成一张新表,来满足后续展示图表所需要的全部字段。
select `销售额`, `数量`, `省/自治区`, `邮寄方式2` as `邮寄方式`, `订单日期` --这里需要将之前改名的字段名称改回去,以确保在和原表关联的时候,数据能对应上-- from ( select '总计' as `省/自治区`, '一级+二级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `邮寄方式` in('一级', '二级') and `p_date`='2023-09-25' group by `省/自治区`,`邮寄方式2`,`订单日期` union all ..... select '总计' as `省/自治区`, '一级+二级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `邮寄方式` in('一级', '二级','标准级','当日') and `p_date`='2023-09-25' group by `省/自治区`,`邮寄方式2`,`订单日期` ) as tmp union all select `省/自治区`, `邮寄方式`, `订单日期`, `销售额`, `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' and `p_date`='2023-09-25'
生成以下格式的数据:
省/自治区 | 邮寄方式2 | 订单日期 | 订单日期 | 数量 |
|---|---|---|---|---|
总计 | 一级+二级 | 2019-01-01 | xxxx | xxxx |
总计 | 一级+二级 | 2019-01-02 | xxxx | xxxx |
...... | ||||
总计 | 一级+二级 | 2019-06-30 | xxxx | xxxx |
总计 | 二级+标准级 | 2019-01-01 | xxxx | xxxx |
...... | ||||
总计 | 二级+标准级 | 2019-06-30 | xxxx | xxxx |
总计 | 一级+二级+标准级 | 2019-01-01 | xxxx | xxxx |
...... | ||||
总计 | 一级+二级+标准级 | 2019-06-30 | xxxx | xxxx |
上海 | 一级 | 2019-01-01 | xxxx | xxxx |
上海 | 一级 | 2019-01-03 | xxxx | xxxx |
北京 | 一级 | 2019-01-05 | xxxx | xxxx |
...... |
用前面操作生成的数据集进行可视化查询,只需要做一些表格上的调整,即可实现传统的中国式报表的样式,也就是在DataWind 上,实现中国式报表的基础展示。
在实现基础的中国式报表之后,我们还可以借助参数的功能为图表增加更多的灵活性。
预先配置好需要的参数,便于后续调用。
应用场景:通过切换日期和不同的省份,来展示所需要的数据片段。
操作步骤:进入「数据准备」-「数据集」页面,点击「参数管理」-「创建参数」,新建相关的日期参数和省份参数。
考虑到存在选择多个省份的场景,「省/自治区」参数勾选了「参数可多选」。
说明
设置为单选和多选的参数,在 SQL 中加入或在新增字段中加入时,写法上会有一些区别:
= {省/自治区} in ({省/自治区})进入 ClickHouse 数据配置页面,在直连下的自定义SQL中点击「插入参数」,在对应的位置插入需要的参数占位。
参数构建步骤:
单一字段构建。
select '总计' as `省/自治区2`, '一级+二级' as `邮寄方式2`, `订单日期`, sum(`销售额`) as `销售额`, sum(`数量`) as `数量` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>={开始日期} and `订单日期`<={结束日期} --这里引入两个日期参数用来作为以后的条件判断,比如 开始日期为2019-01-01 结束日期为2019-06-30 这里实际的条件就是: `订单日期`>='2019-01-01' and `订单日期`<='2019-06-30' 和之前逻辑一致-- and `邮寄方式` in ('一级', '二级') and `p_date`='2023-09-25' and `省/自治区` in ({省/自治区}) --这里引入了另一个参数{省/自治区},但由于参数{省/自治区}是一个可多选的值,比如选择上海和北京,这里就是 `省/自治区` in ('上海','北京') , 所以需要用 in 来做判断,不能用`省/自治区` = {省/自治区} 来做判断-- group by `省/自治区2`,`邮寄方式2`,`订单日期`
多个字段构建。
select sum(`销售额`) as `销售额`, sum(`数量`) as `数量`, '总计' as `省/自治区2`, '一级+二级' as `邮寄方式2`, `订单日期` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>={开始日期} and `订单日期`<={结束日期} and `邮寄方式` in('一级', '二级') and `p_date`='2023-09-25' and `省/自治区` in ({省/自治区}) group by `省/自治区2`, `邮寄方式2`, `订单日期` union all --这里逻辑和上述一样,通过union all 将上下连个表结构一样的内容拼到一起,涉及到多个字段都可以用此类方式拼到一起-- select sum(`销售额`) as `销售额`, sum(`数量`) as `数量`, '总计' as `省/自治区2`, '二级+标准级' as `邮寄方式2`, `订单日期` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>={开始日期} and `订单日期`<={结束日期} and `邮寄方式` in('标准级', '二级') and `p_date`='2023-09-25' and `省/自治区` in ({省/自治区}) group by `省/自治区2`, `邮寄方式2`, `订单日期`
将新构建的字段和原表拼到一起生成新的数据集。
select `销售额`, `数量`, `省/自治区2` as `所属省份`, `邮寄方式2` as `订单渠道`, `订单日期` from ( select sum(`销售额`) as `销售额`, sum(`数量`) as `数量`, '总计' as `省/自治区2`, '一级+二级' as `邮寄方式2`, `订单日期` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>={开始日期} and `订单日期`<={结束日期} and `邮寄方式` in('一级', '二级') and `p_date`='2023-09-25' and `省/自治区` in ({省/自治区}) group by `省/自治区`, `邮寄方式2`, `订单日期` union all ..... --此处为所有需要构建的字段-- union all select sum(`销售额`) as `销售额`, sum(`数量`) as `数量`, '总计' as `省/自治区2`, '全部方式' as `邮寄方式2`, `订单日期` from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>={开始日期} and `订单日期`<={结束日期} and `邮寄方式` in('一级', '二级', '标准级', '当日') and `p_date`='2023-09-25' and `省/自治区` in ({省/自治区}) group by `省/自治区`, `邮寄方式2`, `订单日期` ) as tmp union all select `销售额`, `数量`, `省/自治区` as `所属省份`, `邮寄方式` as `订单渠道`, `订单日期` --拼接时候需要注意,两个表的结构名称需要一致-- from `aeolus_data_db_rangers_202309`.`aeolus_data_table_22_3751_prod` where `订单日期`>={开始日期} and `订单日期`<={结束日期} and `p_date`='2023-09-25' and `省/自治区` in ({省/自治区})
插入参数后,在构建表的值的SQL中,会根据我们选择的参数**{省/自治区}**的不同,自动统计出不同参数条件下的统计结果。
通过仪表盘加参数,调整参数显隐性,筛选器关联参数以及调整筛选条件顺序等方式,优化前端展示,即可完成更加灵活的中国式报表在 DataWind 上的呈现。