简单的看了下你原先的帖子,老实说,很多图表的展示,均需要在背后做很多数据处理的工作,需要开发者有一定的业务理解和掌握些许数据库相关的知识点。另外,要善于总结图表的业务场景,很多图表其实是具有通用性的。
从这个问题来看,咱们所关注的场景可以概括为:实现按照多维度统计特定条件下的数量。 在当前的场景下,维度就是天数,村委会,条件是已完成采样核酸,最终得到的数据呢,是采样的统计数。
活字格在制作图表有两种方法,第一种是使用内置的图表功能(数据源可以为表格、单元格、数据透视表),第二种是内嵌第三方的图表库。方便学习交流,咱们今天只说第一种方式哈。
在正常的关系型数据表中,直接的展示形式是无法得到咱们想要的效果。所以我们需要在现有的数据表下,按照需要的维度,分别进行统计,得到满足咱们需求的新表来渲染图形。在此直接简述一下处理的流程,类似的问题可以按照相同的方法来解决。
- 统计现有数据在天的维度上各个村子的已采样数量,得到表1。
(1)使用 sql 对原有表检索最近5天已完成的所有数据
- SELECT
- *
- FROM
- test.`表1` AS b
- WHERE
- date_sub( curdate(), INTERVAL 5 DAY) <= date( b.采样时间 )
- AND date( b.采样时间 ) <= curdate()
- AND b.采样情况 = '已完成采样'
复制代码 (2)在上表的结果中,使用sql按照日期,村委会进行统计,最终得到表1- SELECT
- count(*) AS `统计`,
- a.村委会 AS `村委会`,
- date_format( a.采样时间, '%Y-%m-%d' ) AS `日期`
- FROM
- (
- SELECT
- *
- FROM
- test.`表1` AS b
- WHERE
- date_sub( curdate(), INTERVAL 5 DAY) <= date( b.采样时间 )
- AND date( b.采样时间 ) <= curdate()
- AND b.采样情况 = '已完成采样'
- ) AS a
- GROUP BY
- `日期`,
- a.村委会
复制代码
表1
2. 表1可以看到,只存在原表已有的数据,而最近五天(24-28号)中有些天原表是无数据的,也就导致表1中的时间是不连续的。这时就需要我们手动的为表补充缺少的时间点,得到表2。
完整的表2 sql可以查看demo的服务端命令中的sql命令。此处只展示了动态创建临时表的sql。
- SELECT
- @num := @num + 1 AS id,
- date_format(adddate( date_sub(curdate(), INTERVAL 5 DAY), INTERVAL @num DAY ), '%Y-%m-%d' ) AS `日期`
- FROM
- test.`表1` tmp_table,
- ( SELECT @num := 0 ) t
- WHERE
- adddate(date_sub(curdate(), INTERVAL 5 DAY), INTERVAL @num DAY ) <= CURDATE()
- AND @num < 5
复制代码
表2
手动补偿数据其实是有两种方案的
(1)第一种就是数据库层面,通过创建辅助表的方式,通过表连接的方式进行数据绑定映射。其中,也包含了两种方案,上方的sql是动态生成,好处是随用随时创建,不需要后面修改,但是效率很差,尤其是在数据量很大的情况下,每次查询都会创建一次。另外一种方案,可以采用定时任务去创建未来半年的时间绑定表,好处就是查询效率很好,适用的场景更多,但是需要定期去创建新数据,删除老数据。
(2)第二种是在业务侧进行手动插入,在活字格的服务器端命令中,手动循环数据,去判断时间是否存在(无需顾虑重复,因为group by已经保证时间点唯一了),不存在则插入。
本答案采用了第一种方案。第二种题主可以自己实现。
3. 表2的数据已经可以满足我们对于图表的诉求(天数,村委会都有了),接下来只需要将表2的数据,转化为满足图标渲染的数据透视表 表3 (行列调整)即可。
表3
数据透视表的数据绑定和设置可以参考demo
4. 将表3作为数据源,插入图表,得到最终的图表。
对于数据绑定,本demo只做了时间的绑定(所以最终的数据村委会的数量与库中不匹配),村委会的绑定题主可以自己完成,方法类似(手动补偿数据)。
补充说明:
(1)附件是对应的demo,可以下载学习;
(2)方便演示,demo中使用了外联表(mysql),在sql的语法上不具备通用性,但是处理逻辑与内联库完全相同;
(3)很多实际场景,单个数据表结构无法直接完成,需要灵活的使用视图和辅助表来达到自己想要的效果。
(4)由于要使用活字格sql命令功能,所以题主需要对sql,服务端命令,json数据导入表格的知识点进行掌握。
(4)此方法只适用于个人学习或者是低数据量下的使用,大型企业级开发的话,建议使用专用的报表工具或者内嵌图表的方式来完成类似的需求,这样效率和效果都会更好。
|