有没有办法在指定的时间内运行查询,例如过去5个月,并且能够返回每个月创建的记录数量?这是我的表格的样子:
SELECT rID, dateOn FROM claims
答案 0 :(得分:4)
与其他两个答案不同,这将返回所有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
子句中使用变量,但这可能会使代码更具可重用性(例如,您可以将月数作为参数传递)。
答案 1 :(得分:3)
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来证明这一点。
答案 2 :(得分:1)
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)