You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PIVOT中根据条件应用不同的聚合函数?

针对不同状态使用不同聚合函数实现行转列的解决方案

好问题!你遇到的核心问题是:标准的PIVOT子句不支持为不同的转列目标指定不同的聚合函数——它要求所有要转成列的字段都使用同一个聚合逻辑,这就是你之前的代码无效的原因。

要实现“对'O'状态取最小日期,对'P'和'C'状态取最大日期”的需求,最灵活且通用的方案是使用条件聚合(CASE WHEN + 聚合函数),这种方式几乎兼容所有关系型数据库,而且逻辑清晰可控。

正确实现代码

SELECT
    case_record_id AS "CASE_RECORD_ID",
    -- 对'O'状态取最小日期
    MIN(CASE WHEN workflow_status_cd = 'O' THEN workflow_status_dt END) AS "OPEN_DT",
    -- 对'P'状态取最大日期
    MAX(CASE WHEN workflow_status_cd = 'P' THEN workflow_status_dt END) AS "PENDING_DT",
    -- 对'C'状态取最大日期
    MAX(CASE WHEN workflow_status_cd = 'C' THEN workflow_status_dt END) AS "CLOSED_DT"
FROM case_workflow_status
GROUP BY case_record_id;

代码逻辑解释

  1. 条件过滤:每个CASE WHEN只保留对应状态的日期值,其他状态的行在该列会返回NULL
  2. 聚合计算:聚合函数(MIN/MAX)会自动忽略NULL值,只对符合条件的日期进行计算
  3. 分组汇总:按case_record_id分组后,每个案件就会得到一行包含三种状态对应日期的结果

为什么你的原代码无效?

你尝试在PIVOT的聚合部分嵌套CASE来切换聚合函数,这不符合PIVOT的语法规则:

  • PIVOT的聚合函数(比如MIN/MAX)是全局生效的,它会先对整个数据集执行聚合,再将指定的状态值转成列
  • 无法在聚合函数内部根据workflow_status_cd动态切换聚合逻辑,因为此时PIVOT还没有完成状态到列的转换

如果你特别想使用PIVOT语法,也可以先预处理数据(为每个状态计算好对应的聚合值),再进行转列,但这种方式会更繁琐,不如条件聚合直接。

内容的提问来源于stack exchange,提问作者ITWorker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:59:42