2014-01-15 77 views
1

有沒有一種方法可以在指定的時間內運行查詢(比如過去5個月),並且能夠返回每月創建多少條記錄?下面是我的表如下所示:如何統計一段時間內每月的記錄數

SELECT rID, dateOn FROM claims 
+0

您需要一個fitler和一個帶聚合的「GROUP BY」。 – Kermit

回答

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來證明它。

+0

你測試過了嗎? – Kermit

+0

@FreshPrinceOfSO,no;你有嗎? –

+0

我不需要測試它,看看你的'SELECT'列表中沒有'MONTH(dateOn)' – Kermit

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) 
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子句中使用變量,但這可能使代碼的可重用性(例如,你可以傳遞的月數作爲參數)。

相關問題