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

问题描述 投票:0回答:4

是否有一种方法可以在指定的时间内(例如过去 5 个月)运行查询,并能够返回每个月创建的记录数?这是我的桌子的样子:

SELECT rID, dateOn FROM claims
sql sql-server sql-server-2005
4个回答
5
投票
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 来证明这一点。


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
投票
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)

0
投票

使用此代码获取该月的第一天,无论当前日期时间戳如何:DATEADD(mm,DATEDIFF(mm,0,GETDATE())-5,0)

© www.soinside.com 2019 - 2024. All rights reserved.