联接表和选择最大日期

时间:2019-01-09 00:12:57

标签: sql sql-server-2005

我正在处理以下代码。我要做的是将主表(WORKLOAD_RPTG)合并到HISTORY表中,该表将绘制出相关请求,投标和合同的所有状态和日期。

WORKLOAD_RPTG表上,有ID字段用于请求,投标和合同。其中有些可能为NULL,有些可能重复,例如同一REQ_ID可能已经生成了2个或更多具有不同CNTRCT_IDs的合同。

HISTORY表上,有一个REF_ID字段。根据将其连接到WORKLOAD表的方式,您将提取合同,投标或请求的状态历史记录。我想将所有这些信息都放到一个报表中,而不是运行它三次,然后不得不做一堆匹配并在以后合并。

我希望每个项目只有一行(它可以具有合同/投标/请求ID,或者如果经过每个过程则可以具有全部),并具有最新的状态和日期。使用下面的查询将产生如下输出:

CONID - BIDID - REQID - CONSTAT - CONSTAT_DT - BIDSTAT - BIDSTAT_DT ...
ABC12           98765   Opened    01/01/2018   NULL      NULL
ABC12           98765   Closed    02/02/2018   NULL      NULL
ABC34   DEF67   86420   Opened    03/03/2018   Tendered  01/01/2018
ABC34   DEF67   86420   Opened    03/03/2018   Closed    02/02/2018
ABC34   DEF67   86420   Closed    04/04/2018   Tendered  01/01/2018
ABC34   DEF67   86420   Closed    04/04/2018   Closed    02/02/2018
        DEF89   86420   NULL      NULL         Tendered  03/03/2018

我希望它看起来像:

CONID - BIDID - REQID - CONSTAT - CONSTAT_DT - BIDSTAT - BIDSTAT_DT ...
ABC12           98765   Closed    02/02/2018   NULL      NULL
ABC34   DEF67   86420   Closed    04/04/2018   Closed    02/02/2018
        DEF89   86420   NULL      NULL         Closed    04/04/2018

我尝试在日期上使用MAX函数,但有些合同从未投标,因此此处的NULL将导致这些记录从最终报告中删除(即,我将丢失所有Contract#ABC12和出价为DEF89以上。

我怀疑我需要使用子查询,但是我从头开始甚至从头开始。我当前的查询如下:

SELECT   WOR.CNTRCT_ID, WOR.BID_ID, WOR.REQ_ID, 
     WOR.PROJ_NM, WOR.BUYER, REQ.ITEM_TYP_CD, 
     CUS.CUST_REQ_CNTCT_NM, 
     TRA1.TRANS_STAT_CD, 
     TRA1.TRANS_STAT_EFF_DT, TRA1.TRANS_STAT_HIST_ID, 
     TRA2.TRANS_STAT_CD, 
     TRA2.TRANS_STAT_EFF_DT, TRA2.TRANS_STAT_HIST_ID, 
     TRA3.TRANS_STAT_CD, 
     TRA3.TRANS_STAT_EFF_DT, TRA3.TRANS_STAT_HIST_ID  
FROM     dbo.REQ REQ, 
     dbo.CUST_REQ CUS, 
     dbo.WORKLOAD_RPTG WOR
     LEFT OUTER JOIN dbo.TRANS_STAT_HIST TRA1 ON CNTRCT_ID=TRA1.REF_ID  
     LEFT OUTER JOIN dbo.TRANS_STAT_HIST TRA2 ON BID_ID=TRA2.REF_ID  
     LEFT OUTER JOIN dbo.TRANS_STAT_HIST TRA3 ON CAST(REQ_ID as CHAR)=CAST(TRA3.REF_ID as CHAR) 
WHERE    REQ.REQ_ID=CUS.REQ_ID 
AND      WOR.CUST_REQ_ID=CUS.CUST_REQ_ID 
AND      WOR.WRK_LD_RPT_STAT = 'WIP' 
ORDER BY 10, 5

非常感谢您的帮助。

0 个答案:

没有答案