2013-08-05 29 views
0

我有一個查詢,可以計算一個月內的行數(distinct child_name)。我想寫一個查詢,這樣我可以將總計帶回多個月。我希望能夠選擇一個時間範圍,並且在我選擇自動計算的範圍內有幾個月沒有每個月的硬編碼。我讀了一些關於循環和序列的信息,但我發現很難理解。按時間範圍確定的每月計數

DECLARE @From_DT DATE = '2012-07-01', @To_DT DATE = '2013-7-30'; 

SELECT count(Child_Name) as July12_Count 
FROM ECMS_BACKUP.dbo.vw_B2H_CLIENTS 
WHERE CLT_NBR IN (SELECT CLT_NBR FROM ECMS_BACKUP.dbo.ufn_B2H_Enrolled_Clients_List(@From_DT, @To_DT)) 

我想像下面的結果沒有硬編碼。

如果我選擇:

DECLARE @From_DT DATE = '2012-07-01', @To_DT DATE = '2013-10-31'; 

我會得到這樣的:

July12_Count Aug13_Count Sep13_Count Oct13_Count 

251   255   250   245 

任何意見表示讚賞!

+0

不知道'ufn_B2H_Enrolled_Clients_List(@From_DT,@From_DT)'應該是'ufn_B2H_Enrolled_Clients_List(@From_DT,@To_DT)'(注意,從'變化@ From_DT'到'@ To_DT') –

+0

@Martin Parkin是的,它應該是From_DT到To_DT。謝謝。 – user2270911

+0

'@ From_DT'和'@ To_DT'之間的最大時間間隔是多少?少於1年或更長?如果某些用戶使用這些參數執行此存儲過程會怎樣?'2012-01-01''和'2013-0-30''? –

回答

1

我不得不假設vw_B2H_CLIENTS中的一列是您過濾的日期。

在這種情況下,你可以嘗試以使用DATEPART到組由一個月(由您的日期欄替換DATE_COL),像這樣:

SELECT DATEPART(month, DATE_COL) AS Month, 
     COUNT(*) AS Count 
    FROM ECMS_BACKUP.dbo.vw_B2H_CLIENTS 
    WHERE CLT_NBR IN (SELECT CLT_NBR FROM ECMS_BACKUP.dbo.ufn_B2H_Enrolled_Clients_List(@From_DT, @To_DT)) 
    GROUP BY DATEPART(month, DATE_COL) 

另外請注意,您可以在ufn_B2H_Enrolled_Clients_List有一個錯誤您有@From_DT作爲參數兩次(您可能需要@To_DT)。

這將使你的輸出是這樣的:

Month Count 
7  251 
8  255 
9  250 
10  245 
+0

非常感謝。當我運行這個時,我得到錯誤:Msg 207,Level 16,State 1,Line 8 無效的列名稱'DATE_COL'。 消息207,級別16,狀態1,行4 無效的列名稱'DATE_COL'。 – user2270911

+0

正如我所說的,確保你:'用你的日期列替換DATE_COL'。所以你必須使用你在'vw_B2H_CLIENTS'表格\視圖中過濾的日期列來工作。有兩個'DATE_COL'實例可以替代(一個在'SELECT'和一個在'GROUP BY'中) - 確保你獲得了兩個。 –