大数据报表——交叉透视表

公司最近打算自研一个报表平台,基于低代码开发思想, 业务人员只需要通过简单的拖拽方式,即可生成需要的报表。整体架构如下: 

 通过 kettle 来将线上业务数据同步到大数据平台,presto 来实现跨数据源查询功能, 报表可视化平台提供一些报表组件(图表、表格)来供业务人员使用,业务人员拖拽并进行数据绑定后,即可实时进行数据报表的渲染。

我这边主要可视化报表数据接口, 简单的折线图、柱状图、柱线混合、简单图表等都比较简单,在开发交叉透视表的时候走了一些弯路,但好在最后及时回正,现将思路整理如下:

交叉透视表数据结构:

{
    "success": true,
    "data": {
        "data": {
            "superHeaders": [
                [
                    {
                        "colspan": 2
                    },
                    {
                        "colspan": 2,
                        "name": "Apple"
                    },
                    {
                        "colspan": 4,
                        "name": "Huawei"
                    }
                ]
            ],
            "columns": [
                {
                    "name": "area",
                    "id": "area"
                },
                {
                    "name": "province",
                    "id": "province"
                },
                {
                    "id": "SUM(money)@0",
                    "name": "iphoneX"
                },
                {
                    "id": "SUM(money)@1",
                    "name": "macbook pro"
                },
                {
                    "id": "SUM(money)@2",
                    "name": "Huawei P40"
                },
                {
                    "id": "SUM(money)@3",
                    "name": "Huawei P50"
                },
                {
                    "id": "SUM(money)@4",
                    "name": "iphoneX"
                },
                {
                    "id": "SUM(money)@5",
                    "name": "荣耀x"
                }
            ],
            "fixRow": 2,
            "combineNum": 1,
            "rows": [
                {
                    "area": "华东",
                    "province": "上海",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "15000",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "223000",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华东",
                    "province": "吉林",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "3000",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华东",
                    "province": "山东",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "4000",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华东",
                    "province": "广东",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "10000"
                },
                {
                    "area": "华东",
                    "province": "江苏",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "5",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华东",
                    "province": "江西",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "10000"
                },
                {
                    "area": "华东",
                    "province": "河北",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "7500"
                },
                {
                    "area": "华东",
                    "province": "河南",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "11000"
                },
                {
                    "area": "华东",
                    "province": "湖南",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "8400",
                    "SUM(money)@5": "1800"
                },
                {
                    "area": "华东",
                    "province": "黑龙江",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "4400",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华中",
                    "province": "安徽",
                    "SUM(money)@0": "5000",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华中",
                    "province": "湖北",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "4600",
                    "SUM(money)@3": "-",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                },
                {
                    "area": "华北",
                    "province": "山西",
                    "SUM(money)@0": "-",
                    "SUM(money)@1": "-",
                    "SUM(money)@2": "-",
                    "SUM(money)@3": "75000",
                    "SUM(money)@4": "-",
                    "SUM(money)@5": "-"
                }
            ]
        },

    "code": 1,
    "msg": "成功"
}

通过结果来反向推:

传参:行列、指标

交叉透视表数据结果就有三部分组成: 超级表头(superHeaders), 列(columns),数据行(rows)


原创不易,如果觉得有用,请随手 分享、在看~

 

posted on 2021-12-20 11:23  XuHe1  阅读(166)  评论(0编辑  收藏  举报