You need to enable JavaScript to run this app.
导航
中国式报表最佳实践-数据集参数高阶应用
最近更新时间:2024.08.01 20:04:40首次发布时间:2024.08.01 20:04:40

1.概述

中国式报表是一种具有独特特点和复杂需求的报表形式,通常以 Excel 文件为基础,经过一系列处理最终生成,是多数国内传统企业数据管理与展示的一环,其也称作“复杂报表”。其展示形式和 DataWind 的仪表盘有所不同,更类似于数据透视表的样式。为适应国内企业多样化和精细化的管理需求,中国式报表数据量通常较大,密集地涵盖了众多明细数据和汇总数据;计算方式复杂多样,包含多种数学计算和逻辑判断;统计维度丰富,需要从多个角度和层次对数据进行全面分析和展示,以满足不同部门和层级的多样需求;同时极为注重数据的完整性和准确性,力求精确无误地呈现所有相关数据。正是这种复杂且具有特定条件的选择性计算,导致绝大部份的敏捷 BI 的图表功能难以直接且有效地对其进行支持和展示,给数据的呈现和分析带来了一定的挑战。
如下图,中国式报表格式包含多层级的汇总与特定条件下的计算,现有的敏捷 BI 或可视化工具难以直接通过前端的方式来解决。

DataWind支持利用自定义SQL将所需要的字段优先处理出来,然后和原表拼接到一起形成新表,再通过前端基础的数据透视表功能,将结果展示出来,在 DataWind 中实现中国式报表的效果。同时,还可利用直连数据集可插入参数的功能,使得最终的展示结果比传统 Excel 更灵活优秀。
暂时无法在飞书文档外展示此内容

2.操作步骤

利用自定义SQL功能,可实现中国式报表在DataWind仪表盘中的呈现。

Before-原始表未处理时展现结果

单纯的数据透视表样式图表,无法达到中国式报表展示的需求。

After-处理后结果

利用自定义SQL的功能,读取原始数据源,将需要字段处理好后和原数据拼接,处理成为所需要的数据集。
利用直连可以带入参数的功能,预先将设定好的参数带入,实现前端在展示图表时的灵活性。

2.1 接入数据源

(1)点击数据准备-数据集-创建-新建数据集-ClickHouse数据。
注:由于本次需要利用到直连数据集中插入参数的功能,所以需要用 ClickHouse 数据。

(2)添加后进入到以下页面,选择自定义SQL,直连方式。

2.2 构建需要的数据集

按照实际的业务场景,将所需要二次处理的字段通过SQL语句处理好,再和原表拼接起来。
应用场景:如业务需要将某些条件下的逻辑下的销售额加和到一起,且存在多个加和的场景,这时候需要将每个加和的字段单独拎出来构建之后,再拼接到一起。
(1)单一字段构建

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、订单日期的分组方式,对销售额和数量进行求和--
 --重新命名邮寄方式2的原因在于where的条件中会用到邮寄方式的判断,若不重新命名会导致此判断失效--  

 --这里会生成以下格式的数据
 省/自治区   邮寄方式2     订单日期       销售额    数量
 总计        一级+二级     2019-01-01    xxxx     xxxx
 总计        一级+二级     2019-01-02    xxxx     xxxx
 ......
 总计        一级+二级     2019-06-30    xxxx     xxxx
 --

(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`,`订单日期`

    union all
  --将处理好的字段通过 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`,`订单日期`
    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
 --

**Tips:**由于最终我们需要将这些都显示在总计下,从而需要给这些字段一个统一的维度值,且需要和省份处于同一层级,因此可以给这批字段统一定义一个省/自治区的值。
(3)和原表拼接,即可形成一张新表,来满足我们后续展示图表所需要的全部字段。

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
 ......
 --

2.3 制作可视化图表

用前面操作生成的数据集进行可视化查询,只需要做一些表格上的调整,即可实现传统的中国式报表的样式,也就是在DataWind上,实现中国式报表的基础展示。

3.加入参数提高报表灵活性

在实现基础的中国式报表之后,我们还可以借助参数的功能为图表增加更多的灵活性。

3.1 配置参数

预先配置好需要的参数,便于后续调用。点击**数据准备-数据集-参数管理-创建参数,**创建需要的公共参数。
应用场景:通过切换日期和不同的省份,来展示所需要的数据片段,所以需要建立相关的日期参数和一个省份参数(下图)。

考虑到存在选择多个省份的场景,使用了多选的逻辑,日期参数就相对较为传统,设定好默认值即可。
图片
图片

**Tips:**参数多选和单选的逻辑下,无论是在SQL中写,还是在DataWind新增字段中带入,写法上会有一些区别:

  • 若为单选,一般用“=”完成判断(单选也可能用in判断):

``省/自治区 = {省/自治区}

  • 若参数为多选,则需要在写判断条件时用in的逻辑,且不要忘记括号

``省/自治区 in ({省/自治区})

3.2 插入参数

在 ClickHouse 数据源中,在直连下的自定义SQL中点击插入参数,在对应的位置插入需要的参数占位。

参数构建:
(1)单一字段构建

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`,`订单日期`

(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`,
      `订单日期`

(3)将新构建的字段和原表拼到一起生成新的数据集

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中,会根据我们选择的参数**{省/自治区}**的不同,自动统计出不同参数条件下的统计结果。

3.3 仪表盘筛选调整

通过仪表盘加参数,调整参数显隐性,筛选器关联参数以及调整筛选条件顺序等方式,优化前端展示,即可完成更加灵活的中国式报表在 DataWind 上的呈现。