按时间范围确定的每月计数
Posted
技术标签:
【中文标题】按时间范围确定的每月计数【英文标题】:Monthly Counts determined by time range 【发布时间】:2013-08-05 17:05:41 【问题描述】:我有一个查询可以返回一个月的行数(不同的 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
感谢任何反馈!
【问题讨论】:
不确定ufn_B2H_Enrolled_Clients_List(@From_DT, @From_DT)
是否应该是ufn_B2H_Enrolled_Clients_List(@From_DT, @To_DT)
(注意从@From_DT
到@To_DT
的变化)
@Martin Parkin 是的,应该是 From_DT 到 To_DT。谢谢。
@From_DT
和 @To_DT
之间的最大时间范围是多少?不到 1 年或更长?如果一些用户使用这些参数执行这个存储过程:'2012-01-01'
& '2013-0-30'
怎么办?
@BogdanSahlean 是的,一年
那么你应该检查这些参数。如果用户输入以下值会发生什么:'2012-01-15'
& '2013-01-14'
?您的查询将返回来自January 2012
和January 2013
的行。
【参考方案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
【讨论】:
非常感谢。当我运行它时,我收到错误消息:Msg 207,Level 16,State 1,Line 8 Invalid column name 'DATE_COL'。消息 207,级别 16,状态 1,第 4 行无效的列名称“DATE_COL”。 正如我所说,请确保您:replace DATE_COL by your date column
。因此,您必须使用您在 vw_B2H_CLIENTS
table\view 中过滤的日期列才能使其正常工作。有两个 DATE_COL
实例要替换(一个在 SELECT
中,一个在 GROUP BY
中) - 确保你得到两个。以上是关于按时间范围确定的每月计数的主要内容,如果未能解决你的问题,请参考以下文章