2017-03-06 5 views
2

유형 2 차원 테이블이 커서 select 쿼리에서 성능 문제가 발생합니다 ... 보고서 시작일 및 종료일을 기준으로 차원을 제한하고 싶습니다 ... 그러나 나는 그에게 맞는 쿼리를 얻기 위해 고군분투하고 ... 여기가 ...유형 2에서 선택 보고서 기반 시작 및 종료

declare @DimCustomers table (CKey int, ID nvarchar(20), Customer nvarchar(50), StartDate datetime, EndDate datetime) 

insert into @DimCustomers values 
(100, 'C1', 'Customer1', '2010-01-01', '2010-12-31'), 
(101, 'C1', 'xCustomer1', '2011-01-01', '2011-12-31'), 
(102, 'C1', 'xxCustomer1', '2012-01-01', '2012-12-31'), 
(103, 'C1', 'xxxCustomer1', '2013-01-01', NULL) 

declare @ReportStartDate datetime = '2010-05-01', @ReportEndDate datetime = '2011-03-01' 

select 
* from @DimCustomers 

기대 찾고 무엇의 예입니다 그 사람이 2010-02-01 '를 사이에 보고서를 실행할 때 '및'2011-02-01 '을 입력하면 Ckey 100 및 101을 출력합니다.

'2011-02-01 '과 현재 날짜 -> 101, 102 및 103

사이의 보고서 '2015년 2월 1일'와 현재 날짜 사이의 보고서

->

나는 그게 내가 무엇을 찾고 설명 희망 103 ... 어떻게해야 @DimCustomers에처럼 내 WHERE 절을 보면?

감사

참고 : 나는

답변

0

당신은 종료 날짜에 NULL 값을 가지고 ...로 시작하는 팩트 테이블에 참여하지 않음. 당신은 그것을 처리해야합니다. 예를 들어 : 그것은 여분의 것, 그래서 제 1 및 제 2 경우 모두에 대해 진정한 평가합니다

SELECT * 
FROM @DimCustomers 
WHERE StartDate >= @ReportStartDate 
     AND ISNULL(EndDate,GETDATE()) <= @ReportEndDate 
0
select 
    * 
from 
    @DimCustomers 
where 
    --gets where @ReportStartDate falls in range 
    (@ReportStartDate >= StartDate and @ReportStartDate <= isnull(EndDate,getdate())) 
    or 
    --gets where @ReportEndDate falls in range 
    (@ReportEndDate <= isnull(EndDate,getdate()) and @ReportEndDate >= StartDate) 
    or 
    --gets where the range in data falls inside parameter range 
    (@ReportStartDate < StartDate and @ReportEndDate > isnull(EndDate,getdate())) 
+1

@Aquillo. 물론 공정한 아이디어. – scsimon