如何在Superset中对比选中时段与上月同期销售额?
Superset 选中时段与上月同期销售额对比实现方案
核心问题解答
- 参数有效性:
{{ from_dttm }}和{{ to_dttm }}是Superset日期范围过滤器在自定义SQL中可用的正确内置参数,会自动获取用户选中的日期区间起止值。 - 原SQL语法错误:你之前的语句存在括号嵌套错误和格式问题,导致无返回值:
DATE_SUB('{{ from_dttm }}'), INTERVAL 1 MONTH)多了一个右括号,DATE_SUB的正确语法是DATE_SUB(日期表达式, INTERVAL 间隔值)ANDDATE_SUB之间缺少空格,SQL解析会直接报错
修正后的实现步骤
方式一:两个独立Big Number图表分别展示
1. 选中时段销售额图表
- 添加基础筛选确保数据范围(或依赖仪表盘全局过滤器自动生效):
WHERE date BETWEEN '{{ from_dttm }}' AND '{{ to_dttm }}' - 聚合指标选择
SUM(你的销售额字段名),图表标题设为「选中时段总销售额」
2. 上月同期销售额图表
- 使用修正后的自定义SQL筛选器(以MySQL为例):
WHERE date BETWEEN DATE_SUB('{{ from_dttm }}', INTERVAL 1 MONTH) AND DATE_SUB('{{ to_dttm }}', INTERVAL 1 MONTH) - 若使用PostgreSQL,需调整日期函数语法:
WHERE date BETWEEN ('{{ from_dttm }}'::DATE - INTERVAL '1 month') AND ('{{ to_dttm }}'::DATE - INTERVAL '1 month') - 聚合指标同样选择
SUM(你的销售额字段名),图表标题设为「上月同期总销售额」
方式二:单图表同时展示两个数值(更高效)
通过自定义SQL一次性返回两个指标,在同一个Big Number图表中实现同屏对比:
SELECT SUM(CASE WHEN date BETWEEN '{{ from_dttm }}' AND '{{ to_dttm }}' THEN 你的销售额字段名 ELSE 0 END) AS 选中时段销售额, SUM(CASE WHEN date BETWEEN DATE_SUB('{{ from_dttm }}', INTERVAL 1 MONTH) AND DATE_SUB('{{ to_dttm }}', INTERVAL 1 MONTH) THEN 你的销售额字段名 ELSE 0 END) AS 上月同期销售额 FROM 你的销售数据表 WHERE -- 保留产品、地区等过滤器的自动注入逻辑,Superset会自动替换为对应筛选条件 {{ filter_values('产品字段名') }} {{ filter_values('地区字段名') }}
- 在Big Number图表的「指标」选项中,同时选中两个字段即可完成配置
额外注意事项
- 确保
date字段为DATE或DATETIME类型,若{{ from_dttm }}返回带时区的字符串,可通过DATE()函数转换(如DATE('{{ from_dttm }}'))避免格式不匹配 - 日期过滤器的「时间粒度」需与
date字段的存储粒度一致(如按天筛选则字段为日粒度)
内容的提问来源于stack exchange,提问作者Amanda
相关产品推荐
相关产品推荐

