如何计算一段时间内每月的记录数

时间:2014-01-15 18:42:44

标签: sql sql-server sql-server-2005

有没有办法在指定的时间内运行查询,例如过去5个月,并且能够返回每个月创建的记录数量?这是我的表格的样子:

SELECT rID, dateOn FROM claims

3 个答案:

答案 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)