2014-11-06 87 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」)。這只是有助於澄清。然後

你的條件是

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

其次,您的問題可能是一個date VS datetime問題。如果您的日期爲datetime值,則需要將時間數據轉換爲日期。預定日期可能爲11/5/2014 8:00 PM,而付款日期爲11/5/2014 8:00 am。表面上,你會期望他們是相同的,但時間價值可能會讓你失望。

如果您不使用時間值,我建議將列類型更改爲date。這消除了在將來的查詢中停用時間的需要。如果你不能做到這一點,你可以轉換爲日期,使日期時間無關:

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

+0

這是完美的!非常感謝。我的數據現在非常完美。我現在要做的就是加快速度!再次感謝你! – Heather 2014-11-07 17:40:14