每月计数由时间范围决定

时间:2013-08-05 17:05:42

标签: sql-server monthcalendar

我有一个查询,它会在一个月的时间内返回行数(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

感谢任何反馈!

1 个答案:

答案 0 :(得分: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