2016-03-21 22 views
0

Ich habe eine gespeicherte Prozedur, die Daten aus einer Ansicht auswählt und sie in eine tempTable basierend auf Kriterien einfügt. Ich möchte sicherstellen, dass NULL-Werte für hinzugefügtes Datum ausgeschlossen werden.Gespeicherte Prozedur NULL-Werte SQL Server

Insert into tempIntake(Pop, PlanID, PopFull, ApptDate, 1stAppt, Followup, Rn, UserID) 
select Pop, PlanID, PopFull, InterviewDate, 1stAppt, Followup, rn, @UserID 
from 
    (Select *, row_number() over (partition by PlanID order BY AddedDate ASC) as rn 
    from VInfo) t 
where rn = 1 
and interviewdate >= @fromDate 
and interviewDate <= @toDate 

Wie würde ich das tun?

Ich versuche grundsätzlich nach dem früheren ADDEDDATE zu filtern, aber schließe die NULL-Daten aus, die erscheinen könnten.

Ich habe dieses SP und ich habe auch eine andere gespeicherte Prozedur, ADDEDDATE DESC. Aber ich weiß nicht, ob das die Tatsache mag, dass ich nur ein Date habe. Für die ASC-Partition zieht sie einen Nullwert und für DESC ein tatsächliches Datum (es gibt nur ein Datum). Ich möchte in der Lage sein, dieses Datum in beiden gespeicherten Prozeduren zu verwenden (es sei denn, es gibt mehrere Daten - das ist, wenn ich das früheste Datum und das späteste Datum haben möchte)

Antwort

2

Es sei denn, ich vermisse etwas, ein einfaches wo Klausel in der abgeleiteten Tabelle sollte es tun:

Insert into tempIntake(Pop, PlanID, PopFull, ApptDate, 1stAppt, Followup, Rn, UserID) 
select Pop,PlanID, PopFull,InterviewDate,1stAppt,Followup, rn, @UserID 
from (
    Select *,row_number() over (partition by PlanID order BY AddedDate ASC) as rn 
    from VInfo 
    where AddedDate is not null 
) t 
where rn = 1 
and interviewdate >[email protected] 
and interviewDate <[email protected] 

aktualisieren

nach unserem Gespräch in den Kommentaren denken, dass ich so etwas wie das ist, was Sie suchen:

Insert into tempIntake(Pop, PlanID, PopFull, ApptDate, 1stAppt, Followup, Rn, UserID) 
select Pop,PlanID, PopFull,InterviewDate,1stAppt,Followup, rn, @UserID 
from (
    Select *,row_number() over (partition by PlanID order BY AddedDate ASC) as rn 
    from VInfo 
    where AddedDate is not null 
) t 
where rn = 1 
and interviewdate >[email protected] 
and interviewDate <[email protected] 

union 

select Pop,PlanID, PopFull,InterviewDate,'2016-01-01',Followup, rn, @UserID 
from (
    Select *,row_number() over (partition by PlanID order BY AddedDate ASC) as rn 
    from VInfo t1 
    where AddedDate is null 
    and not exists 
    (
     select 1 
     from VInfo t 
     where AddedDate is not null 
     and interviewdate >[email protected] 
     and interviewDate <[email protected] 
    ) 
) t 
where rn = 1 
and interviewdate >[email protected] 
and interviewDate <[email protected] 
+0

Ist das, was Sie mit der Partition bearbeitet haben, genug, um Daten bis zum frühesten Datum zu ziehen, wo das Datum nicht null ist? – FatBoySlim7

+1

Die 'row_number()' wird mit der 'select'-Klausel berechnet, so dass nur die Zeilen gezählt werden, nachdem sie durch die' where'-Klausel gefiltert wurden. –

+0

Für PlanID - zur Zeit habe ich in einigen Fällen mehrere Daten, aber ich habe manchmal auch nur ein Datum, und andere Werte sind NULL. Warum ist es, wenn ich nur ein Datum habe und den SP ausführen, die ich in Frage gestellt habe, dass ich den NULL-Wert ziehe, wenn ich Partition durch PlanID-Auftrag durch AddedDate ASC mache, jedoch, wenn ich mache ... Partitionierung nach PlanID-Reihenfolge AddedDate Desc Ich bekomme das Datum. Ich möchte das Datum in beiden Fällen verwenden können. Aus irgendeinem Grund, wenn ich addiere, wo addeddate nicht null ist - ich bekomme nicht alle meine Daten (ich denke, einige PlanIDs haben kein Datum hinzugefügt) – FatBoySlim7

Verwandte Themen