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

SQL同一字段不同条件多聚合函数查询:MAR与MHR表需求

解决方案:获取每个DOCNO的指定状态日期值

嘿,这个需求其实用条件聚合或者子查询关联就能轻松解决,我给你两种常用方案,你可以根据自己的数据库和数据情况选择:

方案一:条件聚合(推荐,代码更简洁)

这种方法在聚合函数里通过CASE语句过滤指定的STA_CD,一次查询就能拿到两个结果:

SELECT 
    mar.DOCNO,
    mar.DT_CLOSED,
    -- 获取STA_CD='P2'的最小STA_DT
    MIN(CASE WHEN mhr.STA_CD = 'P2' THEN mhr.STA_DT END) AS MIN_P2_STA_DT,
    -- 获取STA_CD='C3'的最大STA_DT
    MAX(CASE WHEN mhr.STA_CD = 'C3' THEN mhr.STA_DT END) AS MAX_C3_STA_DT
FROM MYTABLE.MAR mar
-- 用LEFT JOIN确保MAR里的所有DOCNO都被保留,即使MHR中无对应记录
LEFT JOIN MYTABLE.MHR mhr ON mar.DOCNO = mhr.DOCNO
-- 按DOCNO和MAR的DT_CLOSED分组(如果DT_CLOSED是每个DOCNO唯一的话)
GROUP BY mar.DOCNO, mar.DT_CLOSED;

说明:

  • CASE语句会只对符合STA_CD条件的行返回STA_DT,不符合的返回NULL,而MIN/MAX函数会自动忽略NULL值,正好符合我们的需求。
  • 如果某个DOCNO没有P2或C3的记录,对应的字段会显示NULL,如果需要替换成默认值(比如空日期),可以用COALESCE函数,比如COALESCE(MIN(...), '1900-01-01')。

方案二:子查询关联(逻辑更直观)

如果觉得条件聚合有点绕,也可以把两个条件拆成独立的子查询,再和MAR表关联:

SELECT 
    mar.DOCNO,
    mar.DT_CLOSED,
    p2_sub.MIN_STA_DT AS MIN_P2_STA_DT,
    c3_sub.MAX_STA_DT AS MAX_C3_STA_DT
FROM MYTABLE.MAR mar
-- 关联获取P2的最小日期
LEFT JOIN (
    SELECT DOCNO, MIN(STA_DT) AS MIN_STA_DT
    FROM MYTABLE.MHR
    WHERE STA_CD = 'P2'
    GROUP BY DOCNO
) p2_sub ON mar.DOCNO = p2_sub.DOCNO
-- 关联获取C3的最大日期
LEFT JOIN (
    SELECT DOCNO, MAX(STA_DT) AS MAX_STA_DT
    FROM MYTABLE.MHR
    WHERE STA_CD = 'C3'
    GROUP BY DOCNO
) c3_sub ON mar.DOCNO = c3_sub.DOCNO;

说明:

  • 每个子查询单独处理一个状态的聚合,逻辑更清晰,适合后续需要扩展更多状态的场景。
  • 同样用LEFT JOIN保证MAR表的所有记录都被保留,避免丢失数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:28:49