SQL中不同标准的同一场上的多个聚合函数

时间:2018-02-15 19:00:50

标签: sql db2 aggregate-functions

我有2张桌子。第一个是MYTABLE.MAR,第二个是MYTABLE.MHRMARDOCNODT_CLOSEDMHRDOCNOSTA_CDSTA_DT

DOCNO中的MHR列可以在STA_CD中包含多个数据。对于每个DOCNO,我需要获得MIN(STA_DT) where STA_CD = 'P2'MAX(STA_DT) where STA_CD = 'C3'。我可以使用以下代码获取其中一个STA_CD标准的正确信息:

SELECT
    A.DOCNO, A.DT_CLOSED, B.STA_DT AS PICK_DATE
FROM 
    MYTABLE.MAR A 
LEFT OUTER JOIN 
    MYTABLE.MHR B ON B.DOCNO = A.DOCNO
WHERE 
    B.STA_DT = (SELECT MIN(B.STA_DT) 
                FROM MYTABLE.MHR B
                WHERE B.DOCNO = A.DOCNO AND B.STA_CD = 'P2')
    AND A.DT_CLOSED = '2018041'
GROUP BY 
    A.DOCNO, A.DT_CLOSED, B.STA_DT

示例数据:

  DOCNO      DT_CLOSED         STA_CD     PICK_DT        PACK_DT
  ---------------------------------------------------------------
   ABCD      2018041             P2        2/12/18
   ABCD      2018041             C35                   2/13/18
   ABCD      2018041             P2        2/13/18
   ABCD      2018041             C35                   2/14/18

为DocNo获取Min Pick_date(STA_DT,其中STA_CD ='P2')和Max Pack_Date(STA_DT,其中STA_CD ='C35')的预期结果

DOCNO   DT_CLOSED     PICK_DATE   PACK_DATE
-------------------------------------------
ABCD    2018041        2/12/18     2/14/18

我尝试过选择加入子查询并在此处搜索了许多类似的主题,但无法获得此结果以产生所需的结果。任何帮助,将不胜感激。这是我的第一个问题,我是SQL的新手所以要温柔。感谢。

2 个答案:

答案 0 :(得分:0)

SELECT
    A.DOCNO, A.DT_CLOSED, MIN (CASE WHEN B.STA_CD ='P2' THEN B.STA_DT ELSE null END) , MAX (CASE WHEN B.STA_CD ='C35' THEN B.STA_DT ELSE null END) 
FROM 
MYTABLE.MAR A 
LEFT OUTER JOIN 
         MYTABLE.MHR B ON B.DOCNO = A.DOCNO

GROUP BY 
A.DOCNO, A.DT_CLOSED

我正在使用TSQL,但其他人应该类似

答案 1 :(得分:0)

您可以分别创建包含最小值和最大值的辅助表格,然后按mar将它们加到docno表格中,如下所示:

select
  mar.docno,
  mar.dt_closed
  t_min.min_sta_dt,
  t_max.max_sta_dt
from mar
left outer join 
    (select docno, min(sta_dt) as min_sta_dt
     from mhr 
     where sta_cd = 'P2'
     group by docno) t_min on mar.docno = t_min.docno
left outer join
    (select docno, max(sta_dt) as max_sta_dt
     from mhr
     where sta_dt = 'C3'
     group by docno) t_max on mar.docno = t_max.docno

我正在使用标准SQL,但无法访问DB2实例,因此我希望它能为您提供开箱即用的功能。