我正在处理以下代码。我要做的是将主表(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
非常感谢您的帮助。