2013-08-29 3 views
0

MS SQL Server에 익숙한 Oracle 특정 SQL 구문에 약간 새로운 기능입니다.여러 조건에 대해 최대 날짜를 얻는 방법

가입에 문제가 있습니다.

특히, 조인을 사용하면 테이블에서 가장 최근 날짜를 반환 할 수 있습니다. (SQL Server에서는 날짜별로 상위 1 개의 날짜 순서를 선택합니다. 오라클과 혼동 스럽습니다.)

여기 내 전체 쿼리가 있는데, 각 날짜 열의 최대 날짜를 반환하려고합니다. MAX (선택 접두어. (나는 접두사가 최대 접두사가 올바른 구문이 아니라는 것을 안다. 나는이 목록을 여기에 열거하기 때문에 어느 날짜에 다시 최대 날짜가 필요한지 알 수있다.) 나는 그 열이 다시 가장 최근의 날짜를 어떻게받을 수 있나요?

SELECT DISTINCT 
req.LCR_REQUEST_ID "Request_ID" 
,req.MATTER_ID AS "MatterID_lcr" 
,req.CUSTOMER_NAME AS "AccountName_lcr" 
,req.STATUS AS "CurrentContractStatus_lcr" 
,MAX(HIS.RECORDED_DATE) AS "CurrentStatus_ChangeDate" 
--,HIS.STATUS AS "ContractStatus_Historic_lcr" 
,MAX(HIS_SUB.RECORDED_DATE) AS "Submitted_Status_Date" 
--,HIS_NA.RECORDED_DATE AS "NotAssigned_Status_Date" 
,MAX(HIS_AtA.RECORDED_DATE) AS "AssignedToAttorney_Status_Date" 
,MAX(HIS_SCIN.RECORDED_DATE) AS "InNegotiation_Status_Date" 
,MAX(HIS_EXE.RECORDED_DATE) AS "Executed_Status_Date" 
,MAX(HIS_CONV.RECORDED_DATE) AS "ConverteToAmend_Status_Date" 
,MAX(HIS_DEAD.RECORDED_DATE) AS "Dead_Status_Date" 
,MAX(HIS_COMP.RECORDED_DATE) AS "Completed_Status_Date" 
,MAX(HIS_EXP.RECORDED_DATE) AS "Expired_Status_Date" 
,CASE 
WHEN req.DEALSIZE = 0 THEN '' 
WHEN req.DEALSIZE = 1 THEN 'Less Than 100K' 
when req.DEALSIZE = 2 THEN '100K-500K' 
when req.DEALSIZE = 3 THEN '500K-1M' 
when req.DEALSIZE = 4 THEN '1M-10M' 
when req.DEALSIZE = 5 THEN '>10M' 
END 
AS "DealSize_lcr" 
,cm_out.PTY_NAME AS "AccountName_cm" 
,cm_out.PTY_ID AS "PTYID_CM" 
,req.customer_id "PtyID_lcr" 
,cm_out.EFFECTIVE_DATE "EffDate_lcr" 
,cm_out.INITIALTERM_END_DATE "CPEDate_lcr" 
,cm_out.CONTRACT_TERMINATION_DATE "FCTDate_lcr" 
,cm_out.TERM_NOTICE_NONCOMP_REASON "ReasonForTermination_lcr" 
,cm_out.TERM_TYPE "TermType_lcr" 
,cm_out.INITIALTERM_DURATION "InitialTerm_lcr" 
,cm_out.INVOICE_TIMEMEAS "InitialTermTymeMeas_lcr" 
,cm_out.NUMBER_OF_RENEWALS "NumberOfRenewals_lcr" 
,req.AMENDMENT "ParentMatterID_lcr" 
,prod.rpg "RPG_lcr" 
,prod.SALES_PRODUCT_NAME "Product_lcr" 
,prod.CONTRACT_TYPE "ContractType_lcr" 
,req.CONTRACT_ROLE "ContractRole_lcr" 
,cm_out.METADATA_FLAG "MetaFlag_lcr" 
,CASE 
WHEN cm_out.DATA_AUTO_IMPORT_YN = 1 THEN 'YES' 
WHEN cm_out.REQUESTOR = 'Imported Record' THEN 'YES' 
ELSE 'NO' 
END 
"DataImport_lcr" 
,CASE act.actionstatus 
WHEN 'Cancel Date Update' THEN 'Yes' 
ELSE NULL 
END "ActionToCancelAutoDate_lcr" 
,req_emp.FIRST_NAME || ' ' || req_emp.LAST_NAME "Requestor_lcr" 
,att_emp.FIRST_NAME || ' ' || att_emp.LAST_NAME "Attorney_lcr" 
,req.REQUESTOR_DEPARTMENT "Requestor_Department_lcr" 
,req.AGREEMENT_TITLE "AgreementTitle_lcr" 
,req.DATE_RECORDED 
FROM LCR_REQUEST REQ 
LEFT JOIN LCR_ACTION ACT ON req.MATTER_ID = act.MATTER_ID 
LEFT JOIN CM_CONTRACT_OUTBOUND cm_out ON cm_out.MATTER_ID = NVL(req.MATTER_ID,req.AMENDMENT) 
LEFT JOIN LCR_REQUEST_PRODUCT prod_REQ ON prod_req.LCR_REQUEST_ID = req.LCR_REQUEST_ID 
LEFT JOIN LCR_PRODUCT PROD ON prod.PRODUCT_ID = prod_req.PRODUCT_ID 
LEFT JOIN LCR_EMPLOYEE att_emp ON req.ASSIGNED_TO = att_emp.ORACLE_PERSON_ID 
LEFT JOIN LCR_EMPLOYEE req_emp ON req.REQUESTED_BY_ID = req_emp .ORACLE_PERSON_ID 
LEFT JOIN LCR_STATUS_HISTORY HIS ON HIS.LCR_REQUEST_ID = req.LCR_REQUEST_ID AND ((HIS.STATUS = REQ.STATUS) OR (HIS.STATUS = 'Assigned to Attorney' AND REQ.STATUS = 'Assigned To Attorney')) 
--LEFT JOIN LCR_STATUS_HISTORY HIS_NA ON req.LCR_REQUEST_ID = HIS_NA.LCR_REQUEST_ID AND HIS_NA.STATUS = 'Not Assigned' 
LEFT JOIN LCR_STATUS_HISTORY HIS_AtA ON req.LCR_REQUEST_ID = HIS_AtA.LCR_REQUEST_ID AND HIS_AtA.STATUS = 'Assigned to Attorney' 
LEFT JOIN LCR_STATUS_HISTORY HIS_SUB ON req.LCR_REQUEST_ID = HIS_SUB.LCR_REQUEST_ID AND HIS_SUB.STATUS = 'Submitted' 
LEFT JOIN LCR_STATUS_HISTORY HIS_SCIN ON req.LCR_REQUEST_ID = HIS_SCIN.LCR_REQUEST_ID AND HIS_SCIN.STATUS = 'Submission Complete-In Negotiation' 
LEFT JOIN LCR_STATUS_HISTORY HIS_EXE ON req.LCR_REQUEST_ID = HIS_EXE.LCR_REQUEST_ID AND HIS_EXE.STATUS = 'Executed' 
LEFT JOIN LCR_STATUS_HISTORY HIS_CONV ON req.LCR_REQUEST_ID = HIS_CONV.LCR_REQUEST_ID AND HIS_CONV.STATUS = 'Converted to amendment.' 
LEFT JOIN LCR_STATUS_HISTORY HIS_DEAD ON req.LCR_REQUEST_ID = HIS_DEAD.LCR_REQUEST_ID AND HIS_DEAD.STATUS = 'Dead' 
LEFT JOIN LCR_STATUS_HISTORY HIS_COMP ON req.LCR_REQUEST_ID = HIS_COMP.LCR_REQUEST_ID AND HIS_COMP.STATUS = 'Completed' 
LEFT JOIN LCR_STATUS_HISTORY HIS_EXP ON req.LCR_REQUEST_ID = HIS_EXP.LCR_REQUEST_ID AND HIS_EXP.STATUS = 'Expired/Terminated' 
WHERE REQ.CATEGORY_NAME = 'Sales' 
AND 
REQ.DATE_RECORDED BETWEEN to_date ('07/01/2012', 'mm/dd/yyyy') AND to_date ('06/30/2013','mm/dd/yyyy') 
GROUP BY 
req.LCR_REQUEST_ID 
,req.MATTER_ID 
,req.CUSTOMER_NAME 
,req.STATUS 
,HIS.RECORDED_DATE 
--,HIS.STATUS 
,HIS_SUB.RECORDED_DATE 
--,HIS_NA.RECORDED_DATE 
,HIS_AtA.RECORDED_DATE 
,HIS_SCIN.RECORDED_DATE 
,HIS_EXE.RECORDED_DATE 
,HIS_CONV.RECORDED_DATE 
,HIS_DEAD.RECORDED_DATE 
,HIS_COMP.RECORDED_DATE 
,HIS_EXP.RECORDED_DATE 
,CASE 
WHEN req.DEALSIZE = 0 THEN '' 
WHEN req.DEALSIZE = 1 THEN 'Less Than 100K' 
when req.DEALSIZE = 2 THEN '100K-500K' 
when req.DEALSIZE = 3 THEN '500K-1M' 
when req.DEALSIZE = 4 THEN '1M-10M' 
when req.DEALSIZE = 5 THEN '>10M' 
END 
,cm_out.PTY_NAME 
,cm_out.PTY_ID 
,req.customer_id 
,cm_out.EFFECTIVE_DATE 
,cm_out.INITIALTERM_END_DATE 
,cm_out.CONTRACT_TERMINATION_DATE 
,cm_out.TERM_NOTICE_NONCOMP_REASON 
,cm_out.TERM_TYPE 
,cm_out.INITIALTERM_DURATION 
,cm_out.INVOICE_TIMEMEAS 
,cm_out.NUMBER_OF_RENEWALS 
,req.AMENDMENT 
,prod.rpg 
,prod.SALES_PRODUCT_NAME 
,prod.CONTRACT_TYPE 
,req.CONTRACT_ROLE 
,cm_out.METADATA_FLAG 
,CASE 
WHEN cm_out.DATA_AUTO_IMPORT_YN = 1 THEN 'YES' 
WHEN cm_out.REQUESTOR = 'Imported Record' THEN 'YES' 
ELSE 'NO' 
END 
,CASE act.actionstatus 
WHEN 'Cancel Date Update' THEN 'Yes' 
ELSE NULL 
END 
,req_emp.FIRST_NAME || ' ' || req_emp.LAST_NAME 
,att_emp.FIRST_NAME || ' ' || att_emp.LAST_NAME 
,req.REQUESTOR_DEPARTMENT 
,req.AGREEMENT_TITLE 
,req.DATE_RECORDED; 

답변

0

나는 좌의 대부분은 L에 조인 한 TOP 1?

를 사용하여 최대 날짜가 여러 열을 얼마나 궁금 CR_STATUS_HISTORY 쉽게 MAX (CASE)를 사용하여 조인 단일로 대체 될 수 있습니다

LEFT JOIN 
(
    SELECT LCR_REQUEST_ID, 
     MAX(CASE WHEN STATUS = 'Assigned to Attorney' THEN RECORDED_DATE END) AS "AssignedToAttorney_Status_Date" 
    ,MAX(CASE WHEN STATUS = 'Submission Complete-In Negotiation' THEN RECORDED_DATE END) AS "InNegotiation_Status_Date" 
    ,... 
    FROM LCR_STATUS_HISTORY 
    GROUP BY LCR_REQUEST_ID 
) his 
ON HIS.LCR_REQUEST_ID = req.LCR_REQUEST_ID 

그런 다음 당신은 아마 더 이상은 GROUP BY가 필요하지 않습니다.

그리고이 가입 조건에

는 OR-부분을 제거 할 수 있습니다 :

((HIS.STATUS = REQ.STATUS) OR (HIS.STATUS = 'Assigned to Attorney' AND REQ.STATUS = 'Assigned To Attorney')) 
ON HIS.LCR_REQUEST_ID = req.LCR_REQUEST_ID 
+0

는, BTW 실제 질문 귀하의 질문에 "오라클 오른쪽 괄호를 누락"의 제목 사이에 관계가 없다. 당신의 쿼리는 문법적으로 괜찮아야하며 (어쩌면 성능이 좋지 않은 상태로) 실행되어야합니다. – dnoeth

관련 문제