2016-03-21 5 views
0

У меня есть хранимая процедура, которая выбирает данные из представления и вставляет ее в tempTable на основе критериев. То, что я пытаюсь сделать, это убедиться, что если есть значения NULL для добавленной даты, они исключаются.Сохраненная процедура Значения NULL 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 

Как бы я это сделал?

В основном я пытаюсь фильтровать предыдущим ADDEDDATE, но исключать даты NULL, которые могут появиться.

У меня есть этот СП, и у меня также есть еще одна хранимая процедура, которая ADDEDDATE DESC. Но я не знаю, нравится ли мне тот факт, что у меня только одна дата. Для раздела ASC он извлекает нулевое значение, а для DESC он набирает фактическую дату (существует только одна дата). Я хочу, чтобы иметь возможность использовать эту дату в обеих хранимых процедурах (если нет нескольких дат - это то, что я хотел бы, чтобы она захватила самую раннюю дату и последнюю дату)

ответ

2

Если я не пропустил что-то, простое, пункт в производной таблице следует сделать трюк:

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] 

Update

После нашего разговора в комментариях я думаю, что-то вроде этого является то, что вы ищете:

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

Это то, что вы отредактировали с разделом, достаточным для того, чтобы вытащить данные на самую раннюю дату, где дата не равна нулю ??? – FatBoySlim7

+1

'row_number()' вычисляется с помощью предложения 'select', поэтому он только подсчитывает строки после того, как они были отфильтрованы в предложении' where'. –

+0

Для PlanID - в некоторых случаях у меня есть несколько дат, но у меня также иногда есть только одна дата, а другие значения - NULL. Почему это, когда у меня только одна дата и запуск SP, который я включил в вопрос, является то, что я вытягиваю значение NULL, когда я делаю Partition по порядку PlanID с помощью AddDate ASC, однако, когда я это делаю ... Partition by PlanID by by AddedDate Desc Я получаю дату. Я хочу иметь возможность использовать дату в обоих случаях. По какой-то причине, когда я включаю, где adddate не null - я не получаю все свои данные (я думаю, некоторые PlanID не добавили дату) – FatBoySlim7

Смежные вопросы