是否有一种方法可以在指定的时间内(例如过去 5 个月)运行查询,并能够返回每个月创建的记录数?这是我的桌子的样子:
SELECT rID, dateOn FROM claims
SELECT COUNT(rID) AS ClaimsPerMonth,
MONTH(dateOn) AS inMonth,
YEAR(dateOn) AS inYear FROM claims
WHERE dateOn >= DATEADD(month, -5, GETDATE())
GROUP BY MONTH(dateOn), YEAR(dateOn)
ORDER BY inYear, inMonth
在此查询中,
WHERE dateOn >= DATEADD(month, -5, GETDATE())
确保它是过去 5 个月的数据,然后 GROUP BY MONTH(dateOn)
允许它按月计数。
为了安抚社区,这里有一个 SQL Fiddle 来证明这一点。
与其他两个答案不同,这将返回所有 5 个月,即使计数为 0。如果存在合适的索引,它还将使用 onDate 列上的索引(到目前为止,其他两个答案是不可调整的)。
DECLARE @nMonths INT = 5;
;WITH m(m) AS
(
SELECT TOP (@nMonths) DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-number, 0)
FROM master.dbo.spt_values WHERE [type] = N'P' ORDER BY number
)
SELECT m.m, num_claims = COUNT(c.rID)
FROM m LEFT OUTER JOIN dbo.claims AS c
ON c.onDate >= m.m AND c.onDate < DATEADD(MONTH, 1, m.m)
GROUP BY m.m
ORDER BY m.m;
您也不必在
TOP
子句中使用变量,但这可能会使代码更可重用(例如,您可以将月数作为参数传递)。
SELECT
count(rID) as Cnt,
DatePart(Month, dateOn) as MonthNumber,
Max(DateName(Month, dateOn)) as MonthName
FROM claims
WHERE dateOn >= DateAdd(Month, -5, getdate())
GROUP BY DatePart(Month, dateOn)
使用此代码获取该月的第一天,无论当前日期时间戳如何:DATEADD(mm,DATEDIFF(mm,0,GETDATE())-5,0)