在一系列值上运行相同的查询

时间:2014-10-11 15:35:44

标签: sql-server-2012

我有3张桌子,人员,会员和俱乐部。我想知道哪个5年期间注册次数最多。从我听到的SQL Server 2012中没有FOR循环所以我该怎么做?谢谢。像这样:

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

1 个答案:

答案 0 :(得分: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语句定义了一个递归CTE,其中包含2000年至2014年间每年的5年期。根据需要进行调整。