如何对字符串类型状态的Open工单计算累计求和?
解决方案:针对Open状态工单计算累计求和
原SQL的问题分析
你的代码存在两个关键错误:
- 错误地给字段名
ticket_status加了单引号,变成了字符串常量,'ticket_status' = 'open'永远不成立,导致SUM结果始终为0 - 仅按
open_date排序会导致同一天的工单顺序不确定,无法保证累计逻辑和预期一致
修正后的SQL(核心累计逻辑)
如果只需要得到累计数值,closed状态的行显示空值,可使用以下代码:
SELECT id, open_date, ticket_status, ticket_closed, CASE WHEN ticket_status = 'open' THEN SUM(CASE WHEN ticket_status = 'open' THEN 1 ELSE 0 END) OVER (ORDER BY open_date, id ASC ROWS UNBOUNDED PRECEDING) ELSE NULL END AS cumulative_sum FROM tb;
带计算说明的SQL(匹配你期望的输出格式)
如果需要像2(1+1)这样带计算过程的显示格式,可根据数据库语法调整拼接逻辑(以下示例兼容多数主流SQL数据库):
SELECT id, open_date, ticket_status, ticket_closed, CASE WHEN ticket_status = 'open' THEN CONCAT( SUM(CASE WHEN ticket_status = 'open' THEN 1 ELSE 0 END) OVER (ORDER BY open_date, id ASC ROWS UNBOUNDED PRECEDING), '(', LTRIM(STRING_AGG(CASE WHEN ticket_status = 'open' THEN '1' ELSE '' END, '+' ORDER BY open_date, id), '+'), ')' ) ELSE NULL END AS cumulative_sum FROM tb;
注:STRING_AGG是PostgreSQL、SQL Server的函数,MySQL需替换为GROUP_CONCAT,请根据你的数据库类型调整。
结果说明
- 按
open_date + id排序,保证同一天的工单按id顺序累计 - Open状态的行计算截至当前行的所有Open工单总数
- Closed状态的行
cumulative_sum显示空值,符合输出要求
内容的提问来源于stack exchange,提问作者OLIVE99
相关产品推荐
相关产品推荐

