2014-10-11 2 views
0

사용자, 멤버쉽 및 클럽 테이블이 3 개 있습니다. 나는 5 년 기간 중 가장 많은 수의 가입이 있었는지 알아 보려고합니다. 내가 들었을 때 SQL 서버 2012에는 FOR 루프가 없습니다. 어떻게하면됩니까? 감사. 이런 식으로 뭔가 :값 범위에 대해 동일한 쿼리 실행

SELECT count(*) 
FROM Membership 
WHERE Membership.date>=x-01-01 
AND Membership.date<x+10-12-31 

답변

0

당신은 SQL Server의 WHILECURSOR와 FOR 루프 시뮬레이션 할 수 있습니다. 하지만 오라클의 FOR에 비해 오버 헤드가 큽니다. 그러나 거의 언제든지 SQL Server에서 루프를 사용한다고 생각하면 틀린 일이 있습니다.

귀하의 문제는 재귀 CTE에 의해 해결 될 수 있으며, 가입 :

;WITH Periods AS (
    SELECT CAST('2000-01-01' AS Date) AS StartDate, 
      CAST('2004-12-31' AS Date) AS EndDate 
    UNION ALL 
    SELECT DATEADD(year,1,StartDate), 
      DATEADD(year,1,EndDate) 
    FROM Periods 
    WHERE StartDate < '2014-01-01' 
) 

SELECT p.StartDate, 
     p.EndDate, 
     COUNT(m.*) 
FROM Memberships m 
INNER JOIN Periods p ON m.Date BETWEEN p.StartDate AND p.EndDate 
GROUP BY p.StartDate, p.EndDate 

WITH 문은 필요에 따라 조정 2000 년과 2014 년 사이에 매년 5 년의 기간을 포함하는 재귀 CTE를 정의합니다.

관련 문제