2014-11-06 2 views
1

이 대답이 내 얼굴을 쳐다보고 있다고 느낍니다 ... 나는 그것을 볼 수 없습니다. 나는 또한이 문제에 여러 번 빠져 들었지만, 나는 그것에 대한 확고한 답을 중심으로 내 머리를 감싸고있는 것처럼 보일 수 없다. 난 그냥 간단한 조건으로 SQL 쿼리에서 일부 행을 제외해야합니다. 여기 내 코드 :"IF"와 같은 조건으로 SQL 쿼리에서 행을 제외하는 방법

IF OBJECT_ID('tempdb..#NextEvent') IS NOT NULL DROP TABLE #NextEvent 
CREATE TABLE #NextEvent(

    CaseDisplayNumber VARCHAR(20) 
, ScheduledDay DATETIME 
, EventTypeID INT 
, EventType VARCHAR(50) 
, EventResult VARCHAR(50) 
, MatterTypeID INT 
, RowNum INT 

) 
INSERT INTO #NextEvent 
SELECT CC.CaseDisplayNumber 
    ,SD.ScheduledDay 
    ,SE.EventTypeID EventTypeID 
    ,ETC.EventType EventType 
    ,ERC.EventResult 
    ,MTC.MatterTypeID 
    ,ROW_NUMBER() OVER(PARTITION BY CC.CaseDisplayNumber ORDER BY SD.ScheduledDay DESC) 

FROM CourtCase CC 
LEFT JOIN calendar.CaseAssociateEvent CCAE ON CCAE.CourtCaseID = CC.CourtCaseID 
LEFT JOIN calendar.CaseEventHeader CEH ON CEH.CaseEventHeaderID = CCAE.CaseEventHeaderID 
LEFT JOIN calendar.ScheduledDay SD ON SD.CaseEventHeaderID = CEH.CaseEventHeaderID 
LEFT JOIN calendar.ScheduledEvent SE ON SE.CaseEventHeaderID = CEH.CaseEventHeaderID 
LEFT JOIN calendar.ScheduledResult SR ON SR.ScheduledEventID = SE.ScheduledEventID 
LEFT JOIN calendar.EventResultCodes ERC ON ERC.EventResultID = SR.EventResultID 
LEFT JOIN calendar.MatterTypeCodes MTC ON MTC.MatterTypeID = CEH.MatterTypeID 
LEFT JOIN calendar.EventTypeCodes ETC ON ETC.EventTypeID = SE.EventTypeID 

ORDER BY CC.CaseDisplayNumber 
OPTION (MAXDOP 2) 

IF OBJECT_ID('tempdb..#ChargeDispo') IS NOT NULL DROP TABLE #ChargeDispo 
CREATE TABLE #ChargeDispo(

    CaseDisplayNumber VARCHAR(20) 
, Charge VARCHAR(20) 
, ChargeClass VARCHAR(5) 
, DispositionCD VARCHAR(2) 
) 
INSERT INTO #ChargeDispo 
SELECT DISTINCT CC.CaseDisplayNumber 
      ,CCD.ARSCode Charge 
      ,CCC.ChargeClass ChargeClass 
      ,DC.DispositionCD Disposition 


FROM CourtCase CC 
JOIN CaseAction CA ON CA.CourtCaseID = CC.CourtCaseID 
JOIN PartyCaseActionRole PCAR ON PCAR.CaseActionID = CA.CaseActionID 
JOIN Charge C ON C.PartyCaseActionRoleID = PCAR.PartyCaseActionRoleID 
JOIN ChargeActivity CAY ON CAY.ChargeID = C.ChargeID AND CAY.ChargeStatusID = 1 
JOIN ChargeCodes CCD ON CCD.ChargeCodeID = CAY.ChargeCodeID 
JOIN ChargeClassCodes CCC ON CCC.ChargeClassID = CCD.ChargeClassID 
LEFT JOIN ChargeDisposition CD ON CD.ChargeActivityID = CAY.ChargeActivityID 
LEFT JOIN DispositionStatusCodes DSC ON DSC.DispositionStatusID = CD.DispositionStatusID 
LEFT JOIN DispositionCodes DC ON DC.DispositionID = CD.DispositionID 

WHERE DSC.DispositionStatusID = 1 

ORDER BY CCC.ChargeClass 
OPTION (MAXDOP 2) 

SELECT DISTINCT CC.CaseDisplayNumber CaseNumber 
       ,CC.FileDate FileDate 
       ,EN.FullName Defendant 
       ,CD.ChargeClass Class 
       ,CD.DispositionCD DispositionID 
       ,NE.EventType EventType 
       ,NE.ScheduledDay ScheduledDay 
       ,NE.EventResult EventResult 
       ,PD.PayDate DueDate 
       ,fnGetFinancialBalance(FP.financialpartyid) Balance 

FROM CourtCase CC 
JOIN CaseAction CA ON CA.CourtCaseID = CC.CourtCaseID AND CC.CaseStatusID = 1 
JOIN PayDate PD ON PD.CaseActionID = CA.CaseActionID AND PD.EndDate IS NULL 
JOIN PartyCaseActionRole PCAR ON PCAR.CaseActionID = CA.CaseActionID AND PCAR.PartyRoleID = 4 
JOIN financial.FinancialParty FP ON FP.PartyID = PCAR.PartyID 
JOIN Party P ON P.PartyID = PCAR.PartyID 
JOIN PartyRoleCodes PRC ON PRC.PartyRoleID = PCAR.PartyRoleID AND PRC.PartyRoleID = 4 
JOIN Entity E ON E.EntityID = P.EntityID 
JOIN EntityName EN ON EN.EntityID = E.EntityID 
JOIN #ChargeDispo CD ON CD.CaseDisplayNumber = CC.CaseDisplayNumber 
JOIN #NextEvent NE ON NE.CaseDisplayNumber = CC.CaseDisplayNumber AND NE.RowNum = 1 

WHERE 
NE.ScheduledDay <= PD.PayDate 
AND (CD.ChargeClass = 'CV' OR CD.ChargeClass = 'PK') 
AND (CD.DispositionCD = '11' OR CD.DispositionCD = '12' OR CD.DispositionCD = '21' OR  CD.DispositionCD = '22') 
AND fnGetFinancialBalance(FP.financialpartyid) > 0 

ORDER BY PD.PayDate 
OPTION (MAXDOP 2) 

내 문제는 마지막 WHERE 문에 있습니다. 심지어 거기에있을 필요가 있는지 확실하지 않습니다. 내 결과는 거의 완벽합니다. NE.MatterTypeID = 3 인 경우 행을 제거해야하며 NE.ScheduledDay는 PD.PayDate보다 크기가 큽니다 (기본적으로 지불 날짜 이후의 모든 법정 날짜를 제거합니다). 그 외에는 다른 모든 것을 보여주고 싶습니다. 이것은 미래의 쿼리에서도 나를 도울 수 있습니다. 나는 비슷한 문제를 찾고 있었지만 정말로 나를 도와 줄 수있는 대답을 찾을 수 없다. 내가 옳은 것을 찾지 않는 한, 아마도 그럴 수 있습니다. IF를 시도했거나 OR을 시도했는데 CASE (약간 혼란 스럽습니다)를 시도했습니다. 줄 :

NE.ScheduledDay <= PD.PayDate 

작품, 난 좀 더 구체적으로해야합니다.

답변

0

가장 먼저해야 할 일은 논리를 참조하는 방식과 일치하도록 변환하는 것입니다. 예를 들어, "x가 y보다 커야"한다고 말하면, 코드는이를 반영해야합니다. 반대가 아닙니다 ("y는 < = x"이어야합니다). 그것은 단지 명확성에 도움이됩니다.

귀하의 조건은 다음 문제는 가능성이 datedatetime 문제,

Where NOT(NE.MatterTypeID = 3 and NE.ScheduledDay > PD.PayDate) AND --...

두 번째 일 것이다. 날짜가 datetime 인 경우 날짜로 전송하여 시간 데이터를 삭제해야합니다. 지불 날짜가 11/5/2014 8:00 am 인 동안 예정된 날은 11/5/2014 8:00 PM 일 수 있습니다. 표면적으로, 당신은 그것들이 같을 것이라고 기대할 수 있지만 시간 가치는 당신을 던져 버릴 수 있습니다.

시간 값을 사용하지 않으려면 열 유형을 date으로 변경하는 것이 좋습니다. 따라서 향후 쿼리에서 시간을 없앨 필요가 없습니다.

Where NOT(NE.MatterTypeID = 3 and CAST(NE.ScheduledDay as date) > CAST(PD.PayDate as date)) AND --...

+0

이는 완벽했다 : 당신이 그렇게 할 수 없다면, 당신은 날짜가 시간에 얽매이지 수 있도록 날짜로 캐스트 할 수 있습니다! 정말 고맙습니다. 내 데이터는 이제 완벽 해졌습니다. 지금해야 할 일은 속도를 높이는 것뿐입니다! 다시 감사합니다! – Heather

관련 문제