2016-09-23 3 views
0

SQL Sever 데이터베이스를 사용하고 있는데, 각 옵션의 RecordDate를 선택하는 쿼리를 작성하고 있습니다. 설문 시작 날짜와 종료 날짜에 기록이 있습니다. 같은 옵션이 시작과 날짜 사이에 두 번 이상 발견되면 한 번만 고려해야합니다.Sql이 날짜를 사용하여 계산

tblOptions 
---------------------------------- 
Option, RecardDate 
---------------------------------- 
o1 , 2016-01-01 
o1 , 2016-01-03 
o1 , 2016-05-08 
o2 , 2016-01-04 
o2 , 2016-01-01 
o2 , 2016-01-23  
o2 , 2016-05-15 
o3 , 2016-05-01 
o3 , 2016-05-02 
o3 , 2016-05-03  
o3 , 2016-04-04 
o3 , 2016-08-04 


tblSurveys 
---------------------------------- 
Surey, StartDate, EndDate 
---------------------------------- 
s1 , 2016-01-01 , 2016-01-15 
s2 , 2016-01-16 , 2016-01-31 
s3 , 2016-05-01 , 2016-05-31 

OUTPUT은

Option, Count 
------------------- 
o1, 2    (Exp.:o1's recorddates found between two surveys star and end dates)  
o2, 3    (Exp.:o2's recorddates found between three surveys star and end dates) 
o3, 1    (Exp.:o3's recorddates found between one surveys star and end dates) 
+0

설문 조사 샘플 데이터가 잘못되었다고 생각합니다. 's3' 설문 2 건, 2 차 설문의 '종료일'은'시작일 '이전입니다. – iamdave

+0

또한 'OUTPUT'에는 오류가 포함되어 있습니다. 두 번째 설문 조사에서'EndDate '를 수정하더라도'o2 '옵션이 3 가지 설문 조사의'StartDate '및'EndDate '내에 실제로 나타나지 않으므로 오류가 있습니다. – iamdave

답변

0

당신은 함께 그룹화 한 후 함께 데이터를 결합하고 이것을 달성 할 수있다 (아래 distinct 옵션) 그래서 당신은 독특한 조합을 셀 수 :

select [Option]     -- You really should try to avoid using reserved 
     ,count(1) as [Count] -- words for your column names. 
from (
    select distinct o.[Option] 
        ,s.Survey 
        ,s.StartDate 
        ,s.EndDate 
    from @tblOptions o 
     inner join @tblSurveys s 
      on(o.RecardDate between s.StartDate and s.EndDate) 
    ) a 
group by [Option] 
0

을 a COUNT(DISTINCT column)

SELECT 
    o.[Option], COUNT(DISTINCT Survey) [Count] 
FROM 
    tblOptions o 
INNER JOIN 
    tblSurveys s ON o.RecardDate BETWEEN s.StartDate AND s.EndDate 
GROUP BY 
    o.[Option]