规则化数据动态渲染

96 阅读2分钟

背景

目前有一个诉求,想把业务计算完毕后的数据,属于格式化的数据,数据属性值比较固定🧷,以为动态表单的样式展示,但是展示的方式比较多,(涉及到各种计算方式,打平,聚合,行转列等,,),如果使用业务代码来处理,可配置性比较差,毕竟用户的行为具有不确定性,最后使用下面这种方式,只需维护一个map配置表头,和脚本内容。

import sqlite3

def convert_to_sql(string_array, business_meaning):
    # 解析业务含义
    fields = business_meaning.split('#')
    # 创建一个 SQLite 内存数据库
    conn = sqlite3.connect(':memory:')
    cursor = conn.cursor()
    # 创建一个表
    create_table_query = "CREATE TABLE data ({})".format(', '.join(fields))
    cursor.execute(create_table_query)
    # 插入数据
    for string in string_array:
        values = string.split('#')
        # 使用参数化查询
        insert_query = "INSERT INTO data ({}) VALUES ({})".format(', '.join(fields), ', '.join(['?'] * len(values)))
        cursor.execute(insert_query, values)
    # 提交更改
    conn.commit()
    # 执行查询
    select_query = '''
SELECT 
    type,
    orders,
    GROUP_CONCAT(top10) AS top10,
    GROUP_CONCAT(top100) AS top100
FROM 
    (
    SELECT 
        type,
        orders,
        pit,
        CAST(SUM(CASE WHEN pit = 'top100' THEN CAST(d AS REAL) END) as REAL)*100 / SUM(CASE WHEN pit = 'top100' THEN m END) AS top100,
        CAST(SUM(CASE WHEN pit = 'top10' THEN d END) as REAL)*100 / SUM(CASE WHEN pit = 'top10' THEN m END) AS top10
    FROM 
        data
    GROUP BY 
        type, orders, pit
    ) AS subquery
GROUP BY 
    type, orders;
'''
    cursor.execute(select_query)
    # 获取查询结果的列名
    columns = [description[0] for description in cursor.description]
    # 获取结果
    results = cursor.fetchall()
    # 输出结果
    dict_results = []
    for row in results:
        row_dict = {}
        for i, column in enumerate(columns):
            row_dict[column] = row[i]
        dict_results.append(row_dict)
    print(dict_results)  # 打印以字典形式表示的结果
    # 关闭连接
    conn.close()

string_array = ["1#base#有序#top10#23#90", "2#test#有序#top100#45#68",
                "1#base#有序#top10#23#90", "2#test#有序#top100#45#68",
                "1#base#无序#top10#23#90", "2#test#无序#top100#45#68",
                "1#base#无序#top10#23#90", "2#test#无序#top100#45#68"
                ]
business_meaning = "mid#type#orders#pit#d#m"

convert_to_sql(string_array, business_meaning)