2014-11-06 89 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