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
相关产品推荐
相关产品推荐

