PostgreSQL中用CASE运算区分eBike电池规格生成销售报表
区分eBike电池规格的PostgreSQL报表解决方案
我明白你的需求了——要从产品名称里识别基础款(4.4Ah)和升级款(7Ah),用CASE语句结合数学运算生成清晰的销售报表对吧?这就给你一步步拆解解决方案:
第一步:标记每笔订单的电池规格
首先,我们可以通过匹配产品名称里的特征字符串来区分两种电池。你的升级款产品名称会包含Upgrade 7Ah,基础款则包含4,4Ah(注意是逗号分隔)。用CASE语句就能轻松给每一行订单打上规格标签:
SELECT id, orderNumber, date, articleID, clientID, quantity, value, -- 核心逻辑:识别电池规格 CASE -- 优先匹配升级款,避免基础款名称出现误判 WHEN articleID LIKE '%Upgrade 7Ah%' THEN '7Ah 升级款' WHEN articleID LIKE '%4,4Ah%' THEN '4.4Ah 基础款' ELSE '未知规格' END AS battery_spec FROM your_sales_table;
如果你的产品名称格式有波动(比如空格数量不同、大小写不一致),可以用PostgreSQL的正则表达式匹配更灵活:
CASE WHEN articleID ~* 'Upgrade\s+7Ah' THEN '7Ah 升级款' -- ~* 表示不区分大小写匹配 WHEN articleID ~* '4,4Ah' THEN '4.4Ah 基础款' ELSE '未知规格' END AS battery_spec
第二步:结合数学运算生成统计报表
现在我们可以基于识别出的规格,做各种销售数据运算,比如总销量、总收入、平均单价,甚至单独计算升级款带来的额外收益:
基础销售统计报表
SELECT CASE WHEN articleID LIKE '%Upgrade 7Ah%' THEN '7Ah 升级款' WHEN articleID LIKE '%4,4Ah%' THEN '4.4Ah 基础款' ELSE '未知规格' END AS battery_spec, SUM(quantity) AS 总销量, SUM(value * quantity) AS 总收入, -- 数学运算:单价 × 数量 = 单订单金额,再求和 ROUND(AVG(value), 2) AS 平均单价 -- 保留两位小数让数据更直观 FROM your_sales_table GROUP BY battery_spec ORDER BY 总收入 DESC;
计算升级款的额外贡献
如果想单独统计升级款比基础款多带来的收入,可以用CTE(公共表达式)结合CASE和窗口函数实现:
WITH sales_with_spec AS ( SELECT *, CASE WHEN articleID LIKE '%Upgrade 7Ah%' THEN '7Ah 升级款' WHEN articleID LIKE '%4,4Ah%' THEN '4.4Ah 基础款' ELSE '未知规格' END AS battery_spec FROM your_sales_table ) SELECT battery_spec, SUM(quantity) AS 总销量, SUM(value * quantity) AS 总收入, -- 计算升级款相对基础款的额外收入 CASE WHEN battery_spec = '7Ah 升级款' THEN SUM(value * quantity) - SUM(CASE WHEN battery_spec = '4.4Ah 基础款' THEN value * quantity ELSE 0 END) ELSE 0 END AS 升级款额外收入 FROM sales_with_spec GROUP BY battery_spec;
小提醒
- 确保产品名称的格式稳定,如果后续新增电池规格,记得同步更新CASE语句的匹配条件
- 如果
articleID存储的是产品ID而非完整名称,你需要关联产品表获取名称后再做匹配(比如JOIN products ON your_sales_table.articleID = products.id)
内容的提问来源于stack exchange,提问作者nootaku
相关产品推荐
相关产品推荐

