如何基于查询预定义字段名实现可扩展的累计求和?
动态生成分类统计列并实现可扩展求和逻辑
原代码通过Jinja2循环实现了分类变量的统计列生成,自动将分类名转换为total_xxx格式的列名,并对对应AMOUNT字段求和。现在要新增一个可扩展的总和列,自动计算所有生成的统计列之和,无需手动修改求和表达式。
修改后的完整代码
{% set columns = ("transfer out", "transfer in", "fee") %} SELECT -- 原有循环生成分类统计列的逻辑 {% for column in columns %} , round( sum(case when table.variable = '{{ column }}' then table.amount else 0 end) , 2) as total_{{ column|replace(" ", "_")|replace("-", "_") }}s {% endfor %} -- 新增循环生成求和逻辑 , round( {% for column in columns %} total_{{ column|replace(" ", "_")|replace("-", "_") }}s {% if not loop.last %} + {% endif %} {% endfor %} , 2) as total_sum FROM your_table GROUP BY -- 按需添加分组字段,无分组需求可删除此行
代码说明
- 分类统计列生成:保留原有逻辑,遍历
columns列表为每个分类生成求和列,列名自动替换空格/连字符为下划线,添加total_前缀与s后缀。 - 可扩展求和逻辑:
- 再次遍历
columns列表,拼接所有生成的统计列名,用+连接 - 通过
loop.last判断是否为最后一个元素,避免多余的+符号 - 用
round统一保留两位小数,最终生成total_sum列
- 再次遍历
效果示例
当columns列表新增元素(如"refund")时,代码会自动生成total_refunds列,并将其纳入total_sum的计算中,无需手动修改求和表达式。生成结果示例:
| column | amount |
|---|---|
| total_transfer_outs | -90 |
| total_transfer_ins | 100 |
| total_fees | -10 |
| total_refunds | 5 |
| total_sum | 5 |
内容的提问来源于stack exchange,提问作者D. Bryant
相关产品推荐
相关产品推荐

